我试图通过修改来自https://docs.python.org/3.4/library/enum.html#interesting-examples的自动编号来执行一些C风格的枚举
我无法确定如何对__init__
函数进行编码
class MyEnum (Enum):
def __new__(cls):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
def __new__(cls, value):
super().__new__(cls, value) # It doesn't matter what I put here...
class ThingsToDo (MyEnum):
first_thing = 30
second_thing = ()
...
another_thing = 50
yet_another_thing = ()
等等,可以在初始化期间设置值。我尝试了很多不同的方法来定义__new__
,但大多都会出现以下错误:
File "/usr/lib/python3.7/enum.py", line 218, in __new__
enum_member = __new__(enum_class, *args)
TypeError: __new__() takes 1 positional argument but 2 were given
尽管上面代码中的调用给出了以下信息:
File "/usr/lib/python3.7/enum.py", line 218, in __new__
enum_member = __new__(enum_class, *args)
File "./codecs.py", line 34, in __new__
super().__new__(cls, value)
File "/usr/lib/python3.7/enum.py", line 564, in __new__
raise exc
File "/usr/lib/python3.7/enum.py", line 548, in __new__
result = cls._missing_(value)
File "/usr/lib/python3.7/enum.py", line 577, in _missing_
raise ValueError("%r is not a valid %s" % (value, cls.__name__))
ValueError: 30 is not a valid ThingsToDo
我要么错过了一些简单的东西,要么这是一个比我想象的更大的任务。我不受枚举的限制,所以如果有更好的方法,我愿意
希望您的第二个
__new__
应该是__init__
,但这仍然是不正确的。您(可能)希望您的__new__
看起来是:但是,鉴于上述
__new__
,您的ThingsToDo
枚举成员将是:注意
second
和yet_another_thing
的值为2
和4
,而不是31
和51
。如果这是你所期待的,那么你就可以走了否则,如果要查找
31
和51
,则需要__new__
从上次定义的枚举中查找值并递增:相关问题 更多 >
编程相关推荐