让对象属性也包含数据源的最佳方式是什么?

What would be the best way to have object properties also contain data source?

我有一个项目,我将各种数据源混合到一个对象的实例中。不同的属性来自不同的来源,但我想跟踪哪些数据来自哪里。该项目在 Python 中,目前使用 Pydantic 来处理一些序列化。你会怎么做?有没有办法扩展 Pydantic 字段来处理这种情况?数据源将在 运行 time/object 实例化时已知,不一定是对象定义。

一般流程可能是这样的:

  1. 从源 A 创建稀疏对象(将所有对象属性归因于源 A)
  2. 从源 B 创建另一个稀疏对象(将所有对象属性归因于源 B)
  3. 使用属性保存到数据存储

在Python中,您可以在运行时将属性附加到对象。只需创建一个带有字典作为属性的商店对象,您可以在其中保存源代码,然后执行以下操作:

class Store():
    def __init__(self):
        self.sources = {}


# Some custom object A
class ObjectA():
    def __init__(self):
        self.a_0 = 3
        self.a_1 = lambda t: str(t)

# Some custom object B
class ObjectB():
    def __init__(self):
        self.b_0 = dict(foo=3, bar=4)
        self.b_1 = set([7, 8])
       
store = Store()
obj_a = ObjectA()
obj_b = ObjectB()

for obj in (obj_a, obj_b):
    # Get all attributes except the special ones
    attributes = [t for t in dir(obj) if not t.startswith("__")]
    
    # Add them to the store as attributes and save their sources as
    # class name in store.sources
    for attr in attributes:
        setattr(store, attr, getattr(obj, attr))
        store.sources.update({attr: type(obj)})

这给了你

store.sources
{'a_0': __main__.ObjectA,
 'a_1': __main__.ObjectA,
 'b_0': __main__.ObjectB,
 'b_1': __main__.ObjectB}

你可以做到

print(store.a_0)
print(store.a_1)
print(store.b_0)
print(store.b_1)

这导致

3
<function ObjectA.__init__.<locals>.<lambda> at 0x000001837CDBE5E0>
{'foo': 3, 'bar': 4}
{8, 7}