如何获取Python3.7新的数据类字段类型?

2024-06-16 09:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

Python3.7引入了名为数据类的新特性。

from dataclasses import dataclass

@dataclass
class MyClass:
    id: int = 0
    name: str = ''

在函数参数中使用类型提示(注释)时,可以使用inspect模块轻松获取注释类型。如何获取数据类字段类型?


Tags: 数据namefromimportid类型myclass特性
3条回答

dataclasses.py是一个模块,它通过使用字段注释为生成常规类方法提供装饰符和函数。这意味着在处理类之后,用户定义的字段应使用PEP 526 Syntax of Variable annotations形成。模块注释可以作为__annotations__访问。

根据Runtime effects of type annotations,可以通过__annotations__属性或使用typing.get_type_hints(最后一个是推荐的)来访问带注释的类型。

请参阅下面的一些代码示例:

from typing import Dict, ClassVar, get_type_hints
from dataclasses import dataclass

@dataclass
class Starship:
    hitpoints: int = 50


get_type_hints(Starship) // {'hitpoints': int}
Starship.__annotations__ // {'hitpoints': int}
dataclasses.__annotations__ // The annotations of the dataclasses module.
get_type_hints(get_type_hints)

检查__annotations__会提供原始注释,但这些注释不一定对应于数据类的字段类型。像ClassVar和InitVar这样的东西出现在__annotations__中,即使它们不是字段,继承的字段也不会出现。

相反,对数据类调用^{},并检查字段对象:

field_types = {field.name: field.type for field in fields(MyClass)}

__annotations__fields都不会解析字符串注释。如果要解析字符串注释,最好的方法可能是^{}get_type_hints将包括ClassVars和InitVars,因此我们使用fields来过滤它们:

resolved_hints = typing.get_type_hints(MyClass)
field_names = [field.name for field in fields(MyClass)]
resolved_field_types = {name: resolved_hints[name] for name in field_names}
from dataclasses import dataclass

@dataclass
class MyClass:
    id: int = 0
    name: str = '' 

myclass = MyClass()

myclass.__annotations__
>> {'id': int, 'name': str}
myclass.__dataclass_fields__
>> {'id': Field(name='id',type=<class 'int'>,default=0,default_factory=<dataclasses._MISSING_TYPE object at 0x0000000004EED668>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=_FIELD),
 'name': Field(name='name',type=<class 'str'>,default='',default_factory=<dataclasses._MISSING_TYPE object at 0x0000000004EED668>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=_FIELD)}

另一方面,还有:

myclass.__dataclass_params__
>>_DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)

相关问题 更多 >