将 DataClass 成员声明存储到变量中

storing dataclass member declarations into variables

提问人:Diaa Malek 提问时间:10/16/2023 最后编辑:JNevillDiaa Malek 更新时间:10/16/2023 访问量:39

问:

我正在调用一个 get_unit API,它返回一个包含有关单元信息的 json。API 支持发送标志。现在,假设可能的标志是 basicsensorslast_update,并且根据标志,它会返回数据。如果需要,我可以提供多个标志 我想将json读入数据类,但我不想为每个标志组合编写数据类。所以我的想法是为每个标志创建一个数据类,并像这个问题中提到的那样做“动态多重继承”。

@dataclass
class SaUnitBasic(DataclassFromDict):
    _id: str = field_from_dict(default="")
    last_update: Union[dict, list, None] = field_from_dict(default_factory=list)
    counters: Union[dict, list, None] = field_from_dict(default_factory=dict)


@dataclass
class SaUnitUpdates(DataclassFromDict):
    _id: str = field_from_dict(default="")
    counters: Union[dict, list, None] = field_from_dict(default_factory=dict)


@dataclass
class SaUnitSensors(DataclassFromDict):
    _id: str = field_from_dict(default="")
    sensors: Union[dict, list, None] = field_from_dict(default_factory=list)

正如你所看到的,一些基本字段是按照_id的标志定义的,而有些字段可以存在于不同的标志中,如计数器

有没有办法将其存储在变量中并像这样重用它,而不是每次都重写成员定义(因为我可能会更改默认行为)?

_id_VAR =(_id: str = field_from_dict(default=""))
counters_VAR = (counters: Union[dict, list, None] = field_from_dict(default_factory=dict))
@dataclass
class SaUnitBasic(DataclassFromDict):
    _id_VAR
    last_update: Union[dict, list, None] = field_from_dict(default_factory=list)
    counters_VAR


@dataclass
class SaUnitUpdates(DataclassFromDict):
    _id_VAR
    counters_VAR


@dataclass
class SaUnitSensors(DataclassFromDict):
    _id_VAR
    sensors: Union[dict, list, None] = field_from_dict(default_factory=list)

我尝试像第二个示例一样编写它,但这显然是错误的 python 语法。

继承 python-dataclasses

评论

0赞 MegaIng 10/16/2023
如果要重用字段,请使用基类。因此,应该在所有“标志”继承自的基类中定义,并且应该在只有某些“标志”继承的不同基类中定义。但总的来说,老实说,这是一个非常奇怪的设计。_id_Varcounters_VAR
0赞 Diaa Malek 10/17/2023
@MegaIng说实话,我自己也开始有这种感觉了。有没有更好的想法或设计模式可以帮助解决这个问题?我环顾四周,这似乎是最可行的(使用 OOP)
1赞 MegaIng 10/17/2023
我不太确定您首先为什么要将字典转换为数据类。如果没有与此相关的静态保证,它就不会给你带来任何好处:它更慢,占用更多内存,更难编写,对名称建议没有帮助,......OOP 是解决某些问题的一个很好的解决方案。这不是其中之一。对此的 OOP 解决方案可能是使用一个类,该类具有所有这些属性,并且在访问无效属性时会出错。
0赞 jsbueno 10/24/2023
正如@MegaIng所说:只有当你在编码时知道字段时,OOP才是好的,然后工具可以帮助你,以及点属性访问(如:“instance.counter”)。否则,只需使用映射 - “instance['counter']” - 您无需进行任何转换。

答: 暂无答案