具有默认Enum值的Enum类方法失败

问题描述 投票:2回答:2

[我很清楚,如果您有一个使用枚举的类名进行类型提示的类方法,那么可以使用它来在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.6的pythonic方法,但不是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的元组而不是实际值。

我很清楚,如果您有一个使用枚举的类名进行类型提示的类方法,那么可以通过破解使它在Python 3.6及以下版本中正常工作。代替...类Release(Enum):......

python enums python-3.6 default-value type-hinting
2个回答
0
投票

虽然这绝对是一种解决方法,但对我来说似乎很好用:


0
投票

您的代码遇到的问题在这里:

© www.soinside.com 2019 - 2024. All rights reserved.