【发布时间】:2020-03-03 17:39:31
【问题描述】:
我很清楚,如果您有一个使用枚举的类名进行类型提示的类方法,那么有一个技巧可以让它在 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 3.6 是否有一种不是 hack 的 Pythonic 方法? 另外,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 的元组,而不是实际的值。
【问题讨论】:
-
current和cascade有什么区别?current究竟是如何设置的?
标签: python enums python-3.6 default-value type-hinting