Python __annotations_u;不从父数据类返回字段

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

我正在学习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'} (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函数。