我可以简单地列出一个数据类字段

时间:2019-11-04 12:04:04

标签: python

我可以轻松获取dataclass中的字段列表吗?

@dataclass
class C:
    x: int
    y: int
    z: int
    t: int

预期结果:

[x,y,z]

2 个答案:

答案 0 :(得分:4)

您可以使用dataclass的{​​{3}}方法。

如果需要按键:

obj.asdict().keys()

或者如果您想要字段的值:

obj.asdict().values()

以上两种方法都返回一个View对象,您可以对其进行迭代,也可以使用list将其转换为list(...)

答案 1 :(得分:2)

答案取决于您是否有权访问该类的对象。

只是使用类

如果您只能访问该类,则可以使用 dataclasses.fields(C) 返回字段对象列表(每个对象都有一个 .name 属性):

[field.name for field in dataclasses.fields(C)]

来自现有对象

如果你有一个类的构造对象,那么你有两个额外的选择:

  1. 在对象上使用 dataclasses.fields
[field.name for field in dataclasses.fields(obj)]
  1. 使用 dataclasses.asdict(obj)(如 this answer 所指出的)返回一个从字段名称到字段值的字典。听起来您只对字典的 .keys() 感兴趣:
dataclasses.asdict(obj).keys()       # gives a dict_keys object
list(dataclasses.asdict(obj).keys()) # gives a list
list(dataclasses.asdict(obj))        # same 

完整示例

以下是使用您的示例的所有选项:

from dataclasses import dataclass, fields, asdict


@dataclass
class C:
    x: int
    y: int
    z: int
    t: int

# from the class
print([field.name for field in fields(C)])

# using an object
obj = C(1, 2, 3, 4)

print([field.name for field in fields(obj)])
print(asdict(obj).keys())
print(list(asdict(obj).keys()))
print(list(asdict(obj)))

输出:

['x', 'y', 'z', 't']
['x', 'y', 'z', 't']
dict_keys(['x', 'y', 'z', 't'])
['x', 'y', 'z', 't']
['x', 'y', 'z', 't']