如何在Python Enum的__new__方法中结合auto()实现扩展?
解决Python Enum中auto()在__new__方法里失效的问题
问题原因
你在__new__里直接用auto()是行不通的——auto()是个占位符,得由Enum的元类EnumMeta在枚举类定义阶段解析,替换成自增的整数。等到__new__创建成员实例的时候,元类的处理流程已经走完了,auto()此时没有上下文,自然生成不了正确的自增值。
可行解决方案:手动维护类计数器
直接在基类里加一个类级别的计数器,每次创建成员时递增赋值给_value_,就能实现自动生成整数枚举值的需求:
from enum import IntEnum class TokenEnum(IntEnum): _counter = 0 def __new__(cls, value): member = object.__new__(cls) # 用类计数器生成自增的枚举值 member._value_ = cls._counter cls._counter += 1 # 把传入的字符串存入rule属性 member.rule = value return member # 使用示例 class Tokens(TokenEnum): ID = r'[a-zA-Z_][a-zA-Z0-9_]*' NUMBER = r'\d+' OPERATOR = r'[+\-*/]' # 验证效果 print(Tokens.ID.value) # 输出 0 print(Tokens.ID.rule) # 输出 [a-zA-Z_][a-zA-Z0-9_]* print(Tokens.NUMBER.value) # 输出 1 print(Tokens.OPERATOR.value) # 输出 2
补充说明
如果需要从1开始计数,只需要把_counter初始值设为1就行。这种方式比依赖auto()更灵活,完全适配你把传入字符串存到rule属性的需求。
内容的提问来源于stack exchange,提问作者Juergen
相关产品推荐
相关产品推荐

