我知道如果你有一个使用枚举类名作为类型提示的类方法,那么在Python 3.6及以下版本中有一个技巧可使其正常工作。
不要写成...
class Release(Enum):
...
@classmethod
def get(cls, release: Release):
...
您需要像这样使用字符串值...
class Release(Enum):
...
@classmethod
def get(cls, release: "Release"):
...
我相信在 Python 3.7 及以上版本中,有一种更Pythonic的方法来避免使用引号的“hack”。原因是类在所有方法和变量都完成之前不存在。由于类尚不存在,我无法使用类名,必须使用带引号的字符串作为hack。 然而,我正在尝试更进一步并使用默认值,但这并不起作用。是否存在一种Pythonic方法适用于 Python 3.6 而不是hack? 另外,在 Python 3.7 及以上版本中是否已经修复了这个问题?
代码
from enum import Enum
class Release(Enum):
Canary = (1, [])
Beta = (2, [1])
RC = (3, [2, 1])
Stable = (4, [3, 2, 1])
def __new__(cls, value, cascade):
obj = object.__new__(cls)
obj._value_ = value
obj.current = ["Release" * value] # This would technically be a list of all releasese in this enum. This is just to emulate different values
obj.cascade = cascade
return obj
@classmethod
def get_all_releases(cls, release: "Release" = Canary): # Default Value = Release.Canary
return release.current
print(Release.get_all_releases(Release.Canary))
print(Release.get_all_releases(Release.Beta))
print(Release.get_all_releases(Release.RC))
print(Release.get_all_releases(Release.Stable))
# Error. Even with default value
# print(Release.get_all_releases())
使用此代码,我收到以下错误消息。
AttributeError: 'tuple' object has no attribute 'current'
这是因为它返回的是Canary元组,而不是实际值。