__annotations__不返回父数据类的字段

时间:2019-08-22 03:32:26

标签: python python-dataclasses

我正在学习id_usuario,并且在理解为什么dataclass不提供父类的字段方面遇到问题。请参见下面的示例:

__annotations__

1 个答案:

答案 0 :(得分:1)

__annotations__不会为您提供父类的类型注释,因为它应该仅包含在其自身的类主体中定义的注释。有一个特定的函数返回一个类的所有注释,包括其父类的注释,称为typing.get_type_hints

  

这通常与obj.__annotations__相同。 [...]对于C类,返回一个字典,该字典通过以相反的顺序合并所有__annotations__C.__mro__而构成。

在您的特定示例中使用它时要记住的一件事是,数据类使用大量的黑魔法来构造类,并且如果在make_dataclass中未键入某些字段,它将无法查找所有类型提示。定义(作为错误here提交):

import dataclasses as dc
from typing import Any, get_type_hints

@dc.dataclass
class B:
    a: int

get_type_hints(B)
# returns {'a': <class 'int'>}

# fields=["w"] should be equivalent, but get_type_hints doesn't like it. Bug, maybe?
C = dc.make_dataclass("C", fields=[("w", Any)], bases=(B,))

typing.get_type_hints(C)
# returns {'a': <class 'int'>, 'w': typing.Any}

但是,正如user2357112所指出的那样,最好建议您使用dataclasses.fields函数,该函数返回数据类修饰器根据数据类及其基础的注释构建的字段。这通常是 分析数据类时要使用的内容,它包含您需要的所有信息以及更多信息。

此外,它还与您最初使用的make_dataclass中字段的简写定义一起使用,并清除了伪字段:

dc.fields(D)
# returns a tuple of 
Field(name='a',type=<class 'int'>,default=<dataclasses._MISSING_TYPE object at 0x7f103d9985c0>,default_factory=<dataclasses._MISSING_TYPE object at 0x7f103d9985c0>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=_FIELD)
# and
Field(name='w',type=typing.Any,default=<dataclasses._MISSING_TYPE object at 0x7f103d9985c0>,default_factory=<dataclasses._MISSING_TYPE object at 0x7f103d9985c0>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=_FIELD)