Python __annotations_u;不从父数据类返回字段
我正在学习dataclass,我在理解为什么注释没有给出父类中的字段时遇到了问题。请参见下面的示例:Python __annotations_u;不从父数据类返回字段,python,python-dataclasses,Python,Python Dataclasses,我正在学习dataclass,我在理解为什么注释没有给出父类中的字段时遇到了问题。请参见下面的示例: import dataclasses as dc @dc.dataclass class B: a: int B.__annotations__ # returns {'a': int} C = dc.make_dataclass("c", fields=["w"], bases=(B,)) C.__annotations__ # returns {'w': 'typing.Any
import dataclasses as dc
@dc.dataclass
class B:
a: int
B.__annotations__
# returns {'a': int}
C = dc.make_dataclass("c", fields=["w"], bases=(B,))
C.__annotations__
# returns {'w': 'typing.Any'} (without a)
__annotations_u;不提供父类的类型注释,因为它应该只包含在其自身的类主体中定义的注释。有一个特定函数返回类的所有注释,包括其父类的注释,称为:
这通常与obj相同。[…]对于类C,返回一个字典,该字典是通过沿C.\uuuuumro\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
在您的特定示例中使用它时需要记住的一点是,数据类使用了大量的黑魔法来构造类,如果make_dataclass定义中的某些字段作为bug没有类型化,则会中断查找所有类型提示:
将数据类导入为dc
通过键入import Any,获取\u type\u提示
@数据类
B类:
a:整数
获取\u类型\u hintsB
返回{'a':}
fields=[w]应该是等效的,但是get\u type\u提示不喜欢它。也许是虫子?
C=dc.make_dataclassC,字段=[w,Any],基=B,
typing.get\u type\u hintsC
返回{'a':,'w':键入.Any}
但正如user2357112指出的,最好使用函数,该函数返回dataclass decorator基于dataclass及其基的注释构建的字段。这通常是您在分析数据类时想要使用的,它包含您需要的所有信息以及更多信息
此外,它与最初使用的make_dataclass中的字段的速记定义一起使用,并清除伪字段:
直流电场
返回一个
Fieldname='a',type=,default=,default_factory=,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy{},_field_type=_field
和
Fieldname='w',type=typing.Any,default=,default_factory=,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy{},_field_type=_field
嗯,是的。C没有注释。它是注释,而不是字段。如果需要dataclass字段,则有一个dataclasses.fields函数。