python3 在类型注释上引发属性错误

python3 raising attribute-error on type annotation

一些背景信息:我正在使用 mypy_protobuf 包。出于类型检查的目的,它生成 .pyi 文件,并且对于模块 mmm 中的每个枚举包装器 Xxx,它将生成类型 mmm.XxxValue。所以我有一个功能。

def aaa(aaa: mmm.XxxValue) -> None:

它通过了 mypy 检查。当我开始执行程序时,在导入模块 python3 时会引发 AttributeError,因为 mmm 没有 XxxValue,这是正确的,但我希望 python3 可执行文件会简单地忽略注释。

PEP 3107 说:

All annotation expressions are evaluated when the function definition is executed, just like default values.

因此,python3 可执行文件会简单地忽略注释的期望是不正确的。在你的例子中,它们被评估并将结果存储在 aaa.__annotations__ 映射中。

但是,自 Python 3.7 起,您可以使用 future 语句推迟评估:

from __future__ import annotations

现在它们将作为字符串存储在 __annotations__ 映射中。在 Python 3.10 中,这将成为默认行为。 PEP 563.

中的详细信息