从嵌套数据类中提取所有字段名称

Extract all field names from nested dataclasses

提问人:Dan Jackson 提问时间:10/31/2023 更新时间:10/31/2023 访问量:46

问:

我有一个数据类,其中包含另一个数据类:

@dataclass
class A:
    var_1: str
    var_2: int

@dataclass
class B:
    var_3: float
    var_4: A

我想为不是数据类的属性创建一个包含所有字段名称的列表,如果该属性是一个数据类,则列出该类的属性,因此在这种情况下,输出将是我知道可以使用它来获取简单数据类的字段,但我无法弄清楚如何递归地为嵌套数据类执行此操作。理想情况下,我希望能够通过传递类类型 B(以相同的方式将类型传递给 ),而不是 B 的实例来做到这一点。可以这样做吗?['var_3', 'var_1', 'var_2']dataclasses.fieldsdataclasses.fields

谢谢!

蟒蛇 python-dataclasses

评论

0赞 RomanPerekhrest 10/31/2023
请注意,如果代码的某些属性具有交叉引用,这将破坏代码AB

答:

3赞 Barmar 10/31/2023 #1

用于遍历所有字段,列出其名称。dataclasses.fields()

用于判断字段是否为嵌套数据类。如果是这样,请递归到其中,而不是将其名称添加到列表中。dataclasses.is_dataclass()

from dataclasses import fields, is_dataclass

def all_fields(c: type) -> list[str]:
    field_list = []
    for f in fields(c):
        if is_dataclass(f.type):
            field_list.extend(all_fields(f.type))
        else:
            field_list.append(f.name)
    return field_list