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.
中的详细信息
一些背景信息:我正在使用 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.