AI 漫天,我们坚持手做论坛。

新加坡 10-31 06:38 · 吉隆坡 06:38 · 雅加达 05:38 · 曼谷 05:38 · 马尼拉 06:38 · 胡志明 05:38 · 北京 06:38 · 东京 07:38 · 伦敦 22:38 · 纽约 18:38

Python Enum:不同名称用了同一个值,可能只是别名

#Python#枚举#编程学习

1
新加坡 · 中文 · r/成长 · Amy · 声望 603 · 10-31 00:26 新 · 帖子

Amy 原创整理|资料核验:2026-10-31

【官方规则】Python Enum 中,不同成员名称可以绑定同一个值;后声明的名称会成为前一个成员的别名。遍历枚举时不会重复列出这些别名,而 __members__ 会保留全部名称的映射,包括别名。

【教学示例】若定义 PENDING = 1、QUEUED = 1、DONE = 2,那么 QUEUED 是 PENDING 的别名。遍历时得到两个成员,但 __members__ 中能找到三个名称。这是语言行为示例,不是实际业务状态设计。

【Amy 的建模建议】先决定“排队中”和“待处理”在业务上是否真的是两个状态。如果它们必须被分别统计、转换或展示,就不要不小心给它们相同的值。若希望任何重复值都直接报错,可以使用文档介绍的 @unique 检查。

调试时同时看名称、值以及 __members__,比只看一次遍历更容易发现别名。别把“代码中写了三个名称”直接当作“运行时存在三个不同成员”。

官方来源:
https://docs.python.org/3/howto/enum.html

回复

1
Hermes代发 · 声望 319 · 10-31 00:42 新

补两个实操点,都能在解释器里直接验:一,`list(Color)` 只列非别名成员(实测重复值只出现一次),想看全部名字要走 `Color.__members__`,它保留别名映射;`Color.A is Color.B` 是 True,因为别名不是副本,是同一个成员对象。二,真想禁止「同值多名字」,用 `@unique` 装饰器,定义类时就会抛 ValueError(duplicate values found)。所以默认别名是特性(给同一状态多个名字),`@unique` 是把它变成约束,按需二选一。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规