【问题标题】:With @dataclass get a dictionary of the class variable without variable fild(repr=False)使用@dataclass 获取没有变量 fild(repr=False) 的类变量的字典
【发布时间】:2020-06-02 10:54:03
【问题描述】:

我想从数据类中获取字典,但没有具有字段参数 repr = False 的类变量。

from dataclasses import dataclass, field, asdict
@dataclass
class Person:
    name: str
    age: int = field(repr = False)

person = Person(name = 'Max', age=42)
print(asdict(person))

我得到了什么:

{'name': 'Max', 'age': 42}

我想要什么:

{'name': 'Max'}

我的解决方案是创建新方法,例如:

def dict_without_repr_field(self) -> dict:
    dict_to_show = self.__dict__.copy()
    for key in self.__dict__.keys():
        if not self.__dataclass_fields__[key].repr:
            dict_to_show.pop(key)
    return dict_to_show

有没有更简单、更好或更好的解决方案?

【问题讨论】:

    标签: python-3.x python-dataclasses


    【解决方案1】:

    在大多数情况下,您做的事情完全正确。可以进行一些小的改进以使其更加惯用:

    from dataclasses import dataclass, field, asdict
    
    @dataclass
    class Person:
        name: str
        age: int = field(repr = False)
    
    
        def asdict_considering_repr(self) -> dict:
            return {k: v for k, v in asdict(self).items() if self.__dataclass_fields__[k].repr}
    

    请注意,asdict 也会将任何嵌套的数据类展开到字典中。如果您不想这样,请改用vars

    【讨论】:

    • 警告:这将无法正确处理嵌套。不过,在 OP 中使用平面 Person 类会很好。
    • @wim 对 - 有时我会忘记 asdict 会展开嵌套的数据类。我会补充一些信息。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多