Python 3.7 引入了称为数据类的新功能。
from dataclasses import dataclass
@dataclass
class MyClass:
id: int = 0
name: str = ''
在函数参数中使用类型提示(注解)时,您可以使用检查模块轻松获取注解类型。如何获取数据类字段类型?
Python 3.7 引入了称为数据类的新功能。
from dataclasses import dataclass
@dataclass
class MyClass:
id: int = 0
name: str = ''
在函数参数中使用类型提示(注解)时,您可以使用检查模块轻松获取注解类型。如何获取数据类字段类型?
检查__annotations__
为您提供原始注释,但这些注释不一定对应于数据类的字段类型。像 ClassVar 和 InitVar 这样的东西会出现在 中__annotations__
,即使它们不是字段,并且继承的字段也不会出现。
相反,调用dataclasses.fields
数据类,并检查字段对象:
field_types = {field.name: field.type for field in fields(MyClass)}
也__annotations__
不会fields
解析字符串注释。如果要解析字符串注释,最好的方法可能是typing.get_type_hints
. 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)
dataclasses.py是提供装饰器和函数的模块,用于通过使用字段注释生成常规类方法。这意味着在处理类之后,用户定义的字段应使用PEP 526 Syntax of Variable annotations形成。模块注释可作为.__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)