获取数据类中所有字段的名称

问题描述 投票:0回答:3

我正在尝试编写一个函数来记录数据类,我想获取数据类中所有字段的名称并将值打印到每个字段(类似于编写函数来打印字典的方式)

@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"

但是我一直无法找到如何获取数据类的字段,有谁知道如何做到这一点?

python python-dataclasses
3个回答
24
投票

此示例仅显示名称、类型和值,但是,

__dataclass_fields__
Field
对象的字典,每个对象都包含
name
type
default value
等信息。

使用 dataclasses.fields()

使用

dataclasses.fields()
您可以访问在数据类中定义的字段。

fields = dataclasses.fields(dataclass_instance)

使用inspect.getmembers()

使用

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

6
投票

此外,您还可以使用

__annotations__
,因为数据字段总是带有注释。这就是数据类使用的本质。

它适用于课程

    fields = list(Test.__annotations__)

以及实例

    fields = list(test.__annotations__)

需要注意的是,它不适用于数据类子类。明显地。但是,简单性可以直接为您提供字段名称,而无需从 Field 对象中提取额外的代码。


3
投票

使用

__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))
© www.soinside.com 2019 - 2024. All rights reserved.