【发布时间】:2020-02-29 18:01:24
【问题描述】:
我可以轻松获得来自dataclass 的字段列表吗?
@dataclass
class C:
x: int
y: int
z: int
t: int
预期结果:
[x,y,z]
【问题讨论】:
我可以轻松获得来自dataclass 的字段列表吗?
@dataclass
class C:
x: int
y: int
z: int
t: int
预期结果:
[x,y,z]
【问题讨论】:
您可以使用dataclass 的asdict 方法。
如果你想要钥匙:
obj.asdict().keys()
或者如果你想要字段的值:
obj.asdict().values()
以上两种方法都返回一个View 对象,您可以对其进行迭代,或者您可以使用list(...) 将其转换为list。
【讨论】:
obj = C(1,2,4,5),您可以调用 obj.asdict().keys()。我希望很清楚@SylvainPage。
from dataclasses import asdict 然后你可以调用asdict(C()) 来获取字典。
答案取决于您是否有权访问该类的对象。
如果您只能访问该类,那么您可以使用dataclasses.fields(C),它返回一个字段对象列表(每个对象都有一个.name 属性):
[field.name for field in dataclasses.fields(C)]
如果你有一个类的构造对象,那么你有两个额外的选择:
dataclasses.fields:[field.name for field in dataclasses.fields(obj)]
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']
【讨论】: