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

时间:2018-09-04 18:18:48

标签: 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__))

在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

我想我理解为什么会这样。 __init__方法是在dataclasses中定义的,该方法在其环境中没有Foo对象,并且Foo批注将传递到dataclass并附加到__init__作为字符串"Foo"而不是原始对象Foo,但是对于新注释的get_type_hints仅在其中__init__是的模块中进行名称查找没有定义注释的位置。

我觉得我一定做错了。令我惊讶的是,这两个新功能一起发挥得很差。有没有适当的方法来检查__init__方法的类型提示,以便它可以像在普通类上一样在数据类上工作?

1 个答案:

答案 0 :(得分:0)

reported到Python邮件列表时,considered被BDFL视为“不错”。根据{{​​3}}和issue,它应该可以在Python 3.7.2及更高版本中正常工作。