类型提示枚举@classmethod返回枚举成员

时间:2019-11-22 23:06:34

标签: python enums type-hinting mypy

我已经写了一个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下的元编程机制中。 跟进:我可以在这里使用非字符串文字类型注释吗?根据我的经验,我(不正确地)学会了不喜欢字符串文字注释。 (我要和他们牺牲什么吗?)

0 个答案:

没有答案