我正在学习id_usuario
,并且在理解为什么dataclass
不提供父类的字段方面遇到问题。请参见下面的示例:
__annotations__
答案 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)