我可以有一个简单的数据类字段列表吗

Can I have a simple list of a dataclass field

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

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

预期结果:

[x,y,z]

您可以使用dataclasses模块的asdict方法。例如:

from dataclasses import dataclass, asdict


@dataclass
class Person:
    age: int
    name: str


adam = Person(25, 'Adam')

# if you want the keys

print(asdict(adam).keys()) # dict_keys(['age', 'name'])

# if you want the values

print(asdict(adam).values()) # dict_values([25, 'Adam'])

上面的两种方法 return 可以迭代的 View 对象,或者可以使用 list(...).

将其转换为 list

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

只需使用 class

如果您只能访问 class,那么您可以使用 dataclasses.fields(C) 其中 returns 字段对象列表(每个对象都有一个 .name 属性):

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

来自现有对象

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

  1. 对对象使用dataclasses.fields
[field.name for field in dataclasses.fields(obj)]
  1. 使用dataclasses.asdict(obj) (as pointed out by ) 其中returns 一个从字段名到字段值的字典。听起来你只对字典的 .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']