当Enum值不匹配时,为什么此Python函数不会引发错误?

时间:2020-05-06 13:18:06

标签: python enums

如果我具有定义以下https arg的python函数:

color

def search( self, color: ColorEnum = None ) -> Result: 如下所示:

ColorEnum

为什么当我执行以下操作时Python不会引发错误:

class ColorEnum(str, Enum):
    Red = "red",
    Green = "green",
    Blue = "blue"

Enum值仅在编译时使用吗?似乎在运行时没有任何作用,该功能可以正常工作

1 个答案:

答案 0 :(得分:2)

函数注释只是可以附加到函数参数和返回类型的“注释”。尽管您可以访问它们,但它们在运行时无效。

>>> def foo(x: int) -> str: pass
...
>>> foo.__annotations__
{'x': <class 'int'>, 'return': <class 'str'>}

如果选择,则可以使用它们来实现自己的类型检查代码:

def foo(x: int) -> str:
    if not isinstance(x, foo.__annotations__('x')):
        raise ValueError("x is not the right type")
    rv = str(x)
    if not isinstance(rv, foo.__annotations__('return')):
        raise ValueError("wrong return type")
    return rv

这当然很容易被击败,并且引入缺陷和捕获缺陷的可能性一样。

类型提示提供了文档(“您应该传递一个int作为参数,并且您应该返回一个str值。”)以及 static 类型检查器捕获明显错误的方法。给出明确的定义

def foo(x: int) -> str:
    return str(x)

诸如mypy之类的工具可以将如下所示的代码标记为错误,而无需执行该代码:

foo("nine")  # "nine" does not have type int
3 + foo(5)   # foo returns a str, but you can't add int and str values