一些背景信息:我正在使用 mypy_protobuf 包。出于类型检查的目的,它会生成 .pyi 文件,并且对于模块 mmm 中的每个枚举包装器 Xxx,它将生成类型 mmm.XxxValue。所以我有一个功能。
def aaa(aaa: mmm.XxxValue) -> None:
它通过了 mypy 检查。当我开始执行程序时,在导入模块 python3 时会引发 AttributeError 因为 mmm 没有 XxxValue,这是正确的,但我希望 python3 可执行文件会简单地忽略注释。
PEP 3107 说:
所有注释表达式在执行函数定义时都会被求值,就像默认值一样。
因此,认为 python3 可执行文件会简单地忽略注释的期望是不正确的。 在您的情况下,将对它们进行评估并将结果存储在
aaa.__annotations__
映射中。
但是,从 Python 3.7 开始,您可以使用 future 语句推迟评估:
from __future__ import annotations
现在它们将作为字符串存储在
__annotations__
映射中。更多详细信息,请参阅 PEP 563 – 延迟评估注释,以及最近的 PEP 649 – 延迟使用描述符评估注释。