Задать вопрос
  • Можно ли в Python сделать такой механизм, чтобы при изменении значения в любой ветки словаря, я был уведомлен?

    @twistfire92
    Python backend developer
    Как верно подметил fenrir , наследоваться надо от UserDict.
    Чуть поменял код, можете посмотреть что вышло. Была еще проблема в том, что при создании объекта вызывается метод __setitem__, для этого добавил флаг _initialization_finished

    from collections import UserDict
    
    
    class MyDict(UserDict):
        def __init__(self, **kwargs):
            self._initialization_finished = False
            print('Создан объект')
            super().__init__(**kwargs)
            self._initialization_finished = True
    
        def __setitem__(self, item, value):
            if self._initialization_finished:
                print(f"Вы поменяли значение {item} на {value}!")
            if isinstance(value, dict):
                value = MyDict(**value)
            super().__setitem__(item, value)
    
        def __getitem__(self, item):
            print(f"Пытаемся получить значение {item}")
            return super().__getitem__(item)
    
    
    d = MyDict(x='123', y=15, z={'a': 4})
    # Создан объект
    # Создан объект
    
    d['x'] = '456'
    # Вы поменяли значение x на 456!
    
    e = d['y']
    # Пытаемся получить значение y


    Два сообщения подряд "Создан объект" из-за того, что сначала создается основной кастомный словарь, потом создается словарь под ключом z, который тоже вызывает сообщение
    Ответ написан
    Комментировать