Я пытаюсь создать подкласс словаря, который позволяет создать словарь A, который обновит значение в предыдущем словаре B, чтобы оно соответствовало строковому представлению словаря A. Я вижу его как шаблон наблюдателя безвозможность наблюдения нескольких объектов.
т.е.:
import json
from collections import Mapping
class ObservedDict(dict):
def __init__(self, initial_dict, name=None, observer=None, top_level=True):
for k, v in initial_dict.items():
if isinstance(v, dict):
initial_dict[k] = ObservedDict(v, name, observer, top_level=False)
super().__init__(initial_dict)
self.name = name
self.observer = observer
if top_level is True: # initialise the key:value pair in B
observer[name] = json.dumps(initial_dict)
def __setitem__(self, item, value):
if isinstance(value, dict):
_value = ObservedDict(value, self.name, self.observer, top_level=False)
else:
_value = value
super().__setitem__(item, _value)
# Update B
self.observer[self.name] = json.dumps(self)
B = {}
A = ObservedDict({'foo': 1, 'bar': {'foobar': 2}}, 'observed', B)
B теперь {'observed': '{"foo": 1, "bar": {"foobar": 2}}'}
, а A {'foo': 1, 'bar': {'foobar': 2}}
.Существует три варианта обновления значения в словаре (на данный момент игнорируются update
и set
):
- Я могу обновить ключи верхнего уровня А, и это прекрасно работает:
A['foo'] = 2
# B is now automatically {'observed': '{"foo": 2, "bar": {"foobar": 2}}'}
Я могу обновить весь вложенный словарь:
A['bar'] = {'foobar': 4}
# B is now automatically {'observed': '{"foo": 2, "bar": {"foobar": 4}}'}
Но если я редактирую вложенное значение с помощью метода
[]
,
self
в
__setitem__
- это вложенный дикт, а не весь словарь, с которым инициализируется класс
ObservedDict
, поэтому:
A['bar']['foobar'] = 4
# B is now {'observed': '{"foobar": 4}'}
Мой вопрос: как мне сохранить информацию о родительском словаре (то есть, используемом для инициализации класса), чтобы при установке значения в третьем случае словарь B
обновлялся ивключить весь словарь A (в данном случае соответствующий случай 2)?