我很清楚,如果您有一个使用枚举的类名进行类型提示的类方法,那么可以通过破解来使其在Python 3.6及以下版本中正常工作。
而不是...
class Release(Enum):
...
@classmethod
def get(cls,release: Release):
...
您需要像这样使用字符串值...
class Release(Enum):
...
@classmethod
def get(cls,release: "Release"):
...
我相信在python 3.7和更高版本中,您无需使用引号就可以解决这种“ hack”问题,这是一种Python方式。原因是“在所有方法和变量都先完成之前,该类还不存在”。由于该类尚不存在,所以我还不能使用该类的名称,而必须使用带引号的字符串作为技巧。
但是,我正在尝试更进一步,并使用默认值。那是行不通的。
在python 3.7及更高版本中,是否有针对python的pythonic方法不是黑客??代码
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的元组而不是实际值。