如果我具有定义以下https
arg的python函数:
color
def search(
self,
color: ColorEnum = None
) -> Result:
如下所示:
ColorEnum
为什么当我执行以下操作时Python不会引发错误:
class ColorEnum(str, Enum):
Red = "red",
Green = "green",
Blue = "blue"
Enum值仅在编译时使用吗?似乎在运行时没有任何作用,该功能可以正常工作
答案 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