drh*_*gen 7 python annotations python-3.7 python-dataclasses
使用PEP 563,可以from __future__ import annotations更改类型注释,以便对它们进行延迟评估,这提供了很多好处,例如前向引用。
但是,这似乎与其他功能(例如数据类)一起使用时效果很差。例如,我有一些代码检查类的__init__方法的类型参数。(真正的用例是为该类提供默认的序列化器,但这在这里并不重要。)
from dataclasses import dataclass
from typing import get_type_hints
class Foo:
pass
@dataclass
class Bar:
foo: Foo
print(get_type_hints(Bar.__init__))
Run Code Online (Sandbox Code Playgroud)
在Python 3.6和3.7中,这可以完成预期的工作;它打印{'foo': <class '__main__.Foo'>, 'return': <class 'NoneType'>}。
但是,如果在Python 3.7中添加from __future__ import annotations,则失败并显示错误:
NameError: name 'Foo' is not defined
Run Code Online (Sandbox Code Playgroud)
我想我知道为什么会这样。该__init__方法中所定义dataclasses,其不具有Foo对象在其环境,而Foo注释被传递给dataclass并连接到__init__作为字符串"Foo"而不是作为原始对象Foo,但get_type_hints对于新的注释只做一个名称查找,其中所述模块中__init__是未定义注释的定义位置。
我觉得我一定做错了。令我惊讶的是,这两个新功能一起发挥得很差。有没有适当的方法来检查方法的类型提示,__init__以便它可以像在普通类上一样在数据类上工作?
当向 Python 邮件列表报告时, BDFL认为这是一个“好消息”。根据问题,该问题已得到解决。修复的拉取请求已合并并向后移植。从 Python 3.7.6 和 Python 3.8.1 开始,它按预期工作。