输入提示 enum @classmethod 返回成员

问题描述 投票:0回答:1

我和几个成员一起写了一个

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
后续:我可以在这里使用非字符串文字类型注释吗?通过我的经验,我已经学会(可能是错误的)不喜欢字符串文字注释。 (我和他们牺牲了什么吗?)

python enums mypy python-typing
1个回答
0
投票

正如评论部分所讨论的,正确的注释是枚举类本身:

from __future__ import annotations

class StringSize(Enum):
    # ...

    @classmethod
    def from_string(cls, source_string: str) -> StringSize:
        ...
© www.soinside.com 2019 - 2024. All rights reserved.