【发布时间】:2018-03-14 18:40:40
【问题描述】:
我对此进行了研究并找到了类似的答案,但它们在这种情况下不起作用,因为 auto() 的解析早于 __new__ 被调用,并且只有当整个值为 _auto_null 时。
基本上,我想要的是以下内容:
class MyEnum(str, Enum):
one = '1 data'
two = '2 data'
def __new__(cls, data):
member = str.__new__(cls, <NEED NAME HERE>)
member.data = data
member._value_ = <NEED NAME HERE>
assert MyEnum.one == 'one'
assert MyEnum.one.value == 'one'
assert MyEnum.one.data == '1 data'
但是,名称没有传递到__new__,所以没有什么可以填写<NEED NAME HERE>。
然后,我尝试通过以下方式使用auto():
class MyEnumBase(Enum):
def _generate_next_value_(name, start, count, last_values):
return name
class MyEnum(str, MyEnumBase):
one = '1 data'
two = '2 data'
def __new__(cls, data):
member = str.__new__(cls, auto())
member.data = data
member._value_ = auto()
assert MyEnum.one == 'one'
assert MyEnum.one.value == 'one'
assert MyEnum.one.data == '1 data'
这不起作用,因为auto() 仅在定义成员时用作唯一值时才被解析,如one = auto()。因此,似乎甚至不可能执行 one = auto(), '1 data' 然后在 __new__ 函数中获取这两个参数。
class MyEnum(str, MyEnumBase):
one = auto(), '1 data'
two = auto(), '2 data'
def __new__(cls, name, data):
member = str.__new__(cls, name)
member.data = data
member._value_ = name
看来我唯一的选择是硬编码名称:
one = 'one', '1 data'
并定义__new__ 函数以获取两个参数:
def __new__(cls, name, data):
...
我错过了什么吗?有一个更好的方法吗?构建此信息的更好方法?
【问题讨论】:
-
多重继承,枚举元类,天哪!我相信 Ethan Furman 很快就会和你在一起。
-
@wim:好吧,也许需要几分钟——我不得不去查看许多测试,看看我想给出哪个答案。 ;-)
标签: python enums python-3.6