Enum 属性的类型注释

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

我有这段代码:

import enum


class Color(enum.Enum):
    RED = '1'
    BLUE = '2'
    GREEN = '3'


def get_color_return_something(some_color):
    pass

如果我假设我将从 Color 枚举接收枚举属性(例如:

some_color
),如何正确地将类型注释添加到此函数中的
Color.RED
变量?

python enums python-typing
5个回答
118
投票

键入提示 Color 类应该起作用:

def get_color_return_something(some_color: Color):
    print(some_color.value)

23
投票

您可以尝试使用类型提示为 Literal 的选项。

官方 PEP8 文档我们知道:

Literal 它是一种类型,可用于向类型检查器指示相应的变量或函数参数具有等于所提供的文字(或多个文字之一)的值

因此,如果您需要对函数参数使用某些特定值,那么它将是最好的选择之一。但由于枚举值的类型,这种方法不会完全按照我们的预期工作。每个值都有一个 Enum 类类型。这意味着对于下面的代码示例,我们将能够将 Color.GREEN 作为函数参数。因此,这样的解决方案只是为开发人员提供的信息,而不是函数参数的强制规则。

class Color(enum.Enum):
    RED = '1'
    BLUE = '2'
    GREEN = '3'

print(type(Color.RED)  # will return <enum 'Color'>

代码示例:

from enum import Enum
from typing import Literal


class Color(Enum):
    RED = '1'
    BLUE = '2'
    GREEN = '3'

def some_function(some_color: Literal[Color.RED, Color.BLUE]) -> None:
    pass

第二个选项是 @ibarrond 从上面的帖子提供的完全正确的解决方案,只有类类型提示。

some_color: Color

因此,您可以在此处根据您的需求选择要使用的选项。

从我的角度来看,我们可以尝试为开发人员指定可能的 Enum 值,以便更清楚地了解我们对函数的要求。


7
投票
def get_color_return_something(some_color: Color):
    pass

4
投票

以下内容适用于 Pyton 3.9/PyCharm

from enum import Enum
from typing import Optional, Union


class Color(Enum):
    RED: int = 1
    GREEN: int = 2


def guess_color(x: Union[Color.RED, Color.GREEN]) -> Optional[ValueError]:
    if x == Color.RED:
        print("Gotcha!")
    else:
        return ValueError(f"It's not {Color.RED}")


guess_color(Color.RED)

4
投票

另一个奇怪语法解决方法是使用引用的前向引用语法将 Enum 成员指定为 Enum 类的类型(根据PEP 484):

from enum import Enum


class ETest(Enum):
    EXAMPLE: 'ETest' = "example"  <--- forward referenced type


def example() -> ETest:
    return ETest.EXAMPLE


print(type(ETest.EXAMPLE.value))

<class 'str'>

在下图中,很明显 PyCharm 中突出显示的警告不再存在。

type-hint with reference to Enum class

作为参考,这里是 PyCharm 不满的屏幕截图,将

EXAMPLE
成员指定为
<str>
类型是有意义的:

PyCharm pylint warning Enum Typing

我不是这种方法的粉丝,但它确实消除了警告。

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