使用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__
方法的类型提示,以便它可以像在普通类上一样在数据类上工作?
答案 0 :(得分:0)
当reported到Python邮件列表时,considered被BDFL视为“不错”。根据{{3}}和issue,它应该可以在Python 3.7.2及更高版本中正常工作。