Как обнаружить модификацию dict?

Я подклассифицировал dict и должен обнаружить все его изменения.

(Я знаю, что не могу обнаружить модификацию сохраненного значения на месте. Это нормально.)

Мой код:

def __setitem__(self, key, value):
    super().__setitem__(key, value)
    self.modified = True

def __delitem__(self, key):
    super().__delitem__(key)
    self.modified = True

Проблема заключается в том, что он работает только для простого назначения или удаления. Он не обнаруживает изменений, сделанных pop(), popitem(), clear() и update().

Почему __setitem__ и __delitem__ обходят, когда элементы добавляются или удаляются? Должен ли я переопределять все эти методы (pop и т.д.)?

Ответ 1

Для этого использования вы не должны подклассифицировать класс dict, но вместо этого используйте абстрактные классы с помощью collections модуля стандартной библиотеки Python.

Вы должны подклассифицировать абстрактный класс MutableMapping и переопределить следующие методы: __getitem__, __setitem__, __delitem__, __iter__ и __len__, все это с помощью внутреннего dict. Абстрактный базовый класс гарантирует, что все остальные методы будут использовать их.

class MyDict(collections.MutableMapping):
    def __init__(self):
        self.d = {}
        # other initializations ...

    def __setitem__(self, key, value):
        self.d[key] = value
        self.modified = true
    ...

Ответ 2

pop, popitem, clear, update не реализованы через __setitem__ и __delitem__.

Вы также должны переопределить их.

Я могу предложить посмотреть реализацию OrderedDict.