枚举值的Python类型注释

Yuv*_*uss 20 python typing type-hinting python-3.x type-annotation

我有这段代码:

import enum


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


def get_color_return_something(some_color):
    pass
Run Code Online (Sandbox Code Playgroud)

some_color如果我想从Color枚举中接收值(例如:),如何在此函数中的变量中正确添加类型注释Color.RED

iba*_*ond 23

提示Color类应该工作的类型:

def get_color_return_something(some_color: Color):
    print(some_color.value)
Run Code Online (Sandbox Code Playgroud)

  • 如果我将Color.RED传递给此函数,则会收到警告“预期类型为Color,取为str”。 (3认同)
  • 如果您使用此语法进行类型提示,为了代码的清晰度/可读性,最好将这些枚举类放在名为“types”或类似名称的单独模块/文件夹中。 (3认同)
  • @Gazzini我在本地看不到这一点,并且这个在线mypy检查器也没有显示它:[链接](https://mypy-play.net/?mypy=latest&python=3.8&gist=67656249f1527463378d6c7756a9a8f1) (2认同)

小智 19

您可以尝试使用带有类型提示文字的选项。

官方 PEP8 文档我们知道:

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

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

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

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

Run Code Online (Sandbox Code Playgroud)

代码示例:

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
Run Code Online (Sandbox Code Playgroud)

第二个选项是@ibarrond 在上面的帖子中提供的完全正确的解决方案,仅包含类类型提示。

some_color: Color
Run Code Online (Sandbox Code Playgroud)

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

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


Ram*_*lat 7

def get_color_return_something(some_color: Color):
    pass
Run Code Online (Sandbox Code Playgroud)