我已经写了一个enum.Enum
类型的成员。现在,我想编写一个“选择器” @classmethod
,它将根据参数返回Enum
的成员之一,并且我不知道如何正确键入提示 >。
这就是我要做的:
from enum import Enum, auto
from typing import TypeVar, Type
_StringSizeT = TypeVar("_StringSizeT", bound="StringSize")
class StringSize(Enum):
SMALL = auto()
BIG = auto()
@classmethod
def from_string(cls: Type[_StringSizeT], source_string: str) -> _StringSizeT:
n_chars = len(source_string)
if n_chars <= 10:
return cls.SMALL
return cls.BIG
以上对TypeVar()
等的使用,是我试图对@classmethod
工厂采用Martijn Pieters' post in "Can you annotate return type when value is instance of cls?"的方法,但将其应用于Enum
@classmethod
返回其中一个枚举成员。
不幸的是,mypy不喜欢我的return语句的类型:
error: Incompatible return value type (got "StringSize", expected "_StringSizeT")
这是因为此@classmethod
的属性与该帖子中的不同:我没有返回类的实例,而是返回了 class属性,或者说是成员。
如何在此处修复方法注释?
更新:好的,在撰写本文时,我参考了mypy的建议,发现
-> "StringSize"
是可以接受的。这有点令人困惑,因为同样,我没有返回实例,但是我会将其归纳到Enum
下的元编程机制中。 跟进:我可以在这里使用非字符串文字类型注释吗?根据我的经验,我(不正确地)学会了不喜欢字符串文字注释。 (我要和他们牺牲什么吗?)