新注释打破了对数据类的检查

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__以便它可以像在普通类上一样在数据类上工作?

drh*_*gen 2

当向 Python 邮件列表报告时, BDFL认为这是一个“好消息”。根据问题,该问题已得到解决。修复的拉取请求已合并并向后移植。从 Python 3.7.6 和 Python 3.8.1 开始,它按预期工作。