lov*_*soa 1 python python-dataclasses
其记录的属性是:
- [...]
- type:字段的类型。
对我来说,这似乎意味着该字段将包含类型本身,而不仅仅是字符串形式的名称。
但是,它似乎只是按原样复制类型注释,使其变得毫无用处。
例子:
@dataclasses.dataclass
class C:
c: 'C'
dataclasses.fields(C)[0].type # This returns the string 'C'
typing.get_type_hints(C)['c'] # This returns the class C, as expected
Run Code Online (Sandbox Code Playgroud)
该问题甚至在使用PEP563类型注释时系统性地发生。
这是数据类模块中的错误吗?这是预期的行为吗?如果是这样,我如何检索给定 Field 实例的类型对象?
这是故意的。在导入时解析类型提示是昂贵的,特别是当from __future__ import annotations被用来禁止在首位解决这些问题。
最初,将 PEP 563 添加到 Python 3.7 会在您使用from __future__ import annotationsswitch 并包含ClassVar或InitVar键入字段注释时破坏数据类;这些在这一点上不会被解决,并且仍然是一个字符串。如果您明确使用字符串,这在 PEP 563 之前已经是一个问题,请参阅dataclasses issue #92。这变成了Python 错误,#33453,一旦数据类使其成为 Python 3.7 正确。
在“父”项目attrs,启发dataclasses,也有这个问题要解决。在那里,?ukasz Langa(大多数类型提示peps 的合著者,包括PEP 563)指出:
好的,所以我尝试了上面的方法,它似乎是一个核选项,因为它强制对所有注释进行评估。这是我想避免的
from __future__ import annotations。
在关于修复问题 33453 的拉取请求的讨论中,作者 Eric Smithdataclasses说:
我一直在研究这样做。我认为@ambv 的观点是它引入了由于在每个字段上调用 eval 导致的性能下降,而字符串注释的重点是消除性能下降。
此外,还有其他问题;您无法在导入时评估所有类型提示,而不是在它们使用前向引用时:
除了性能问题之外,在以下情况下(没有
__future__语句和数据类),我收到一个错误,get_type_hints()因为C在get_type_hints()调用时未定义。这是python/typing#508。请注意,get_type_hints()在此示例中调用的 where@dataclass正是将要运行的位置,并且需要调用 stripped downget_type_hints()。
所以最后,dataclasses所做的只是将字符串启发式应用于注释,而不会为您加载它们。
要检索类型,只需get_type_hints()在类本身上使用,并使用 field.name属性作为结果的键:
resolved = typing.get_type_hints(C)
f = dataclasses.fields(C)[0]
ftype = resolved[f.name]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |