我有一个与使用 auto() 和 python enum 相关的问题。
我有一个像这样的基础类:
class TokenEnum(IntEnum):
def __new__(cls, value):
member = object.__new__(cls)
# Always auto-generate the int enum value
member._value_ = auto() # << not working !!
member.rule = value
return member
并想像这样使用它。枚举值应该是 int 并且自动生成。提供的字符串应进入附加的“规则”变量。
class Tokens(TokenEnum):
ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
...
auto()
似乎在我使用它的地方不起作用。以及如何让它发挥作用的想法?
auto
在调用 __new__
之前解析 - 它只能在成员分配行上使用(即 ID = auto()
)。
如果您需要
TokenEnum
成员为整数,您将需要:
def __new__(cls, value):
int_value_ = len(cls.__members__) + 1 # numbering usually starts at 1
member = int.__new__(int_value) # use int, not object
member._value_ = int_value
member.rule = value
return member
如果它们不需要是整数,但你希望值是整数,你可以这样做:
def __new__(cls, value):
int_value_ = len(cls.__members__) + 1 # numbering usually starts at 1
member = object.__new__() # use object, not int
member._value_ = int_value # but assign the int value to _value_
member.rule = value
return member
如果您不需要该值是整数,但确实需要
rule
属性:
def __new__(cls, value):
member = object.__new__() # use object, not int
member._value_ = value
member.rule = value
return member
最后,如果您只想像使用字符串一样使用枚举:
class Tokens(str, Enum):
ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
re.match(ID, some_target_string)
1 披露:我是 Python stdlib
Enum
、enum34
向后移植 和 高级枚举 (aenum
) 库的作者。