Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取Python 3.7新的数据类字段类型?_Python_Python Dataclasses - Fatal编程技术网

如何获取Python 3.7新的数据类字段类型?

如何获取Python 3.7新的数据类字段类型?,python,python-dataclasses,Python,Python Dataclasses,Python3.7引入了称为数据类的新特性 from dataclasses import dataclass @dataclass class MyClass: id: int = 0 name: str = '' 在函数参数中使用类型提示(注释)时,可以使用inspect模块轻松获得注释类型。如何获取数据类字段类型?是一个模块,它提供了修饰符和函数,用于使用字段注释生成常规类方法。这意味着在处理类之后,用户定义的字段将使用。模块注释可以通过\uuuuu注释\uuuu访问

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

from dataclasses import dataclass

@dataclass
class MyClass:
    id: int = 0
    name: str = ''
在函数参数中使用类型提示(注释)时,可以使用inspect模块轻松获得注释类型。如何获取数据类字段类型?

是一个模块,它提供了修饰符和函数,用于使用字段注释生成常规类方法。这意味着在处理类之后,用户定义的字段将使用。模块注释可以通过
\uuuuu注释\uuuu
访问

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)}
根据,可通过
\uuuuu annotations\uuuu
属性或通过使用来访问带注释的类型,最后一个是推荐的类型

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

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)

检查
\uuuuu注释\uuuuu
可以得到原始注释,但这些注释不一定对应于数据类的字段类型。ClassVar和InitVar之类的内容显示在
注释中,即使它们不是字段,继承的字段也不会显示

相反,调用dataclass并检查字段对象:

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

\uuuuuuuuuuuuuuuuuuu注释
字段
都不会解析字符串注释。如果要解析字符串注释,最好的方法可能是
get\u type\u提示
将包括ClassVars和InitVars,因此我们使用
字段
将它们过滤掉:

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}

作者把这篇文章写成对这个问题的正确答案。你能指出一些不鼓励写与评论重叠的答案的文档吗?我不希望使用这样的私有字段。我需要像检查模块签名对象这样的东西。我不希望使用这样的私有字段。不管怎样,谢谢。这不是私人领域。另外,您刚刚接受了一个使用“dunder”属性的答案。顺便说一句,与使用
\uuu注释相比,建议使用get\u type\u提示选项
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}