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

问题描述

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

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

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

解决方法

PEP 3107说:

所有注释表达式都在执行函数定义时进行评估,就像默认值一样。

因此,对python3可执行文件只会忽略注释的期望是不正确的。在您的情况下,系统会对它们进行评估,并将结果存储在aaa.__annotations__映射中。

但是,从Python 3.7开始,您可以使用将来的语句来推迟评估:

from __future__ import annotations

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