我正在尝试编写一个函数来记录数据类,我想获取数据类中所有字段的名称并将值打印到每个字段(类似于编写函数来打印字典的方式)
即
@dataclasses.dataclass
class Test:
a: str = "a value"
b: str = "b value"
test = Test()
def print_data_class(dataclass_instance):
fields = # get dataclass fileds
for field in fields:
print(f{field}: {dataclass.field})
print_data_class(test)
所需输出:
"a": "a value"
"b": "b value"
但是我一直无法找到如何获取数据类的字段,有谁知道如何做到这一点?
此示例仅显示名称、类型和值,但是,
__dataclass_fields__
是Field
对象的字典,每个对象都包含name
、type
、default value
等信息。
dataclasses.fields()
您可以访问在数据类中定义的字段。
fields = dataclasses.fields(dataclass_instance)
inspect.getmembers()
您可以访问数据类中的所有字段。
members = inspect.getmembers(type(dataclass_instance))
fields = list(dict(members)['__dataclass_fields__'].values())
import dataclasses
import inspect
@dataclasses.dataclass
class Test:
a: str = "a value"
b: str = "b value"
def print_data_class(dataclass_instance):
# option 1: fields
fields = dataclasses.fields(dataclass_instance)
# option 2: inspect
members = inspect.getmembers(type(dataclass_instance))
fields = list(dict(members)['__dataclass_fields__'].values())
for v in fields:
print(f'{v.name}: ({v.type.__name__}) = {getattr(dataclass_instance, v.name)}')
print_data_class(Test())
# a: (str) = a value
# b: (str) = b value
print_data_class(Test(a="1", b="2"))
# a: (str) = 1
# b: (str) = 2
此外,您还可以使用
__annotations__
,因为数据字段总是带有注释。这就是数据类使用的本质。
它适用于课程
fields = list(Test.__annotations__)
以及实例
fields = list(test.__annotations__)
需要注意的是,它不适用于数据类子类。明显地。但是,简单性可以直接为您提供字段名称,而无需从 Field 对象中提取额外的代码。
使用
__dict__
属性
def print_data_class(dataclass_instance):
fields = [(attribute, value) for attribute, value in dataclass_instance.__dict__.items()]
for field in fields:
print("{}: {}".format(*field))