使用 auto() 扩展 __new__ 中的 python 枚举

问题描述 投票:0回答:1

我有一个与使用 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()
似乎在我使用它的地方不起作用。以及如何让它发挥作用的想法?

python enums auto
1个回答
0
投票

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
)
库的作者。

© www.soinside.com 2019 - 2024. All rights reserved.