枚举值的Python类型注释

时间:2018-10-03 10:13:35

标签: python python-3.x type-hinting typing type-annotation

我有这段代码:

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变量中正确添加类型注释?

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

def get_color_return_something(some_color: Color):
pass

答案 2 :(得分:0)

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

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

我不是粉丝或这种方法,但它确实摆脱了警告。

答案 3 :(得分:-1)

您可以这样打印名称和值:

import enum

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

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

get_color_return_something(Color.RED)
# RED
# 1

答案 4 :(得分:-2)

以下内容适用于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)