【问题标题】:Can I have a simple list of a dataclass field我可以有一个数据类字段的简单列表吗
【发布时间】:2020-02-29 18:01:24
【问题描述】:

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

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

预期结果:

[x,y,z]

【问题讨论】:

    标签: python python-dataclasses


    【解决方案1】:

    您可以使用dataclassasdict 方法。

    如果你想要钥匙:

    obj.asdict().keys()
    

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

    obj.asdict().values()
    

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

    【讨论】:

    • asdict(instance).keys().... 可以在 Nc 类对象上完成吗?
    • 在您的数据类对象上,例如:obj = C(1,2,4,5),您可以调用 obj.asdict().keys()。我希望很清楚@SylvainPage。
    • 我不知道为什么,但 obj.asdict() 返回“C 没有属性 asdict”。这就是为什么我做 asdict(obj).keys().... 我的导入是从 dataclasses 导入 dataclass, asdict。没关系它和 C.__dataclass_fields__.keys() 一样好用 ...
    • @SylvainPage 您可以查看文档,链接存在于答案中。
    • @SylvainPage 你需要from dataclasses import asdict 然后你可以调用asdict(C()) 来获取字典。
    【解决方案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']
    

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2022-12-17
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2019-01-05
      相关资源
      最近更新 更多