我和几个成员一起写了一个
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()
等的使用是我尝试遵循 Martijn Pieters 在“当值是 cls 实例时可以注释返回类型吗?” 中针对 @classmethod
工厂的帖子的方法,但将它们应用于 Enum
@classmethod
返回枚举成员之一。
不幸的是,mypy 不喜欢我的 return 语句的类型:
error: Incompatible return value type (got "StringSize", expected "_StringSizeT")
这是因为这个
@classmethod
的属性与那篇文章中的不同:我没有返回类的 instance,而是返回 class attribute,或者用枚举来说,是一个成员。
如何修复这里的方法注释?
更新:好的,在写这篇文章时,我反复考虑了 mypy 的建议,发现
-> "StringSize"
可以接受。这有点令人困惑,因为我再次没有返回实例,但我会将其归因于下面的元编程机制
Enum
。 后续:我可以在这里使用非字符串文字类型注释吗?通过我的经验,我已经学会(可能是错误的)不喜欢字符串文字注释。 (我和他们牺牲了什么吗?)
正如评论部分所讨论的,正确的注释是枚举类本身:
from __future__ import annotations
class StringSize(Enum):
# ...
@classmethod
def from_string(cls, source_string: str) -> StringSize:
...