繁体   English   中英

用另一个 class 实例更新 class 实例的 __dict__

[英]Update a class instance's __dict__ by another class instance

我有以下问题:我的 python 脚本 parses.pdf 文档并返回找到的订单信息作为此 class 的实例:

@dataclass
class BasicOrder:
    order_id: str = ''   
    supplier_name: str = ''     
    supplier_order_id: str = ''
    client_order_id: str = ''
    base_name: str = ''
    container_no: str = ''  
    seal_no: str = ''

但是,文档往往没有完整的订单信息,所以我必须查询数据库以查找是否有更多信息。

所以我最终得到了两个对象:BasicOrder class: order_from_pdforder_from_db ,一个填充了一些属性(例如container_noseal_no ),另一个有order_id, supplier_name等(从 pdf 和 db 中得知,可以非常随机因为不同的文件有不同的数据,并不总是正确填写)

最后,我必须将它们“粉碎”成一个完整的 object,我使用这个 function:

    def update_dict(self, another_object_dict: dict):
        for key, value in self.__dict__.items():
            if not value and another_object_dict[key]:
                self.__dict__[key] = another_object_dict[key]

这是一个问题:我可以以某种方式传递另一个 object 实例而不是dict吗? 如果将其用作参数,它会给我Unresolved reference 'BasicOrder'

或者也许有更“干净”的方式来做到这一点?

您可以使用数据类中的asdict function 而不是__dict__来确保没有副作用。 这是一个小例子:

import dataclasses
from typing import Optional


@dataclasses.dataclass
class Foo:
    attr_1: str
    attr_2: Optional[int] = None
    attr_3: Optional[str] = None
    
    def combine_with_other(self, other: Foo) -> Foo:
        attribute_dict_other = dataclasses.asdict(other)
        attribute_dict_self = dataclasses.asdict(self)
        merged_dict = {
            key: attribute_dict_other[key] if attribute is None else attribute 
            for key, attribute in attribute_dict_self.items()
        }
        return Foo(**merged_dict)

这是 output:

>>> db_version = Foo("foo", attr_3="attr_3")
>>> local_version = Foo("foo", 42)
>>> print(local_version.combine_with_other(db_version))
Foo(attr_1='foo', attr_2=42, attr_3='attr_3')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM