Насколько мне известно, невозможно обобщить назначение глобального символа в Python (по крайней мере, в CPython, где глобальные значения хранятся в dict
в module
объекте, оба являются C типами, которые не могут быть исправлены обезьяной ).
Вот простой обходной путь, который немного компромиссен. Используйте объект-оболочку для хранения отслеживаемых переменных и определите __setattr__
, чтобы делать все, что вы хотите, до (или после) установки атрибута.
class CaptureOnSetAttribute:
def __setattr__(self, attr, value):
# our hook to do something
print(f'set value of {attr} to {value}')
# actually set the attribute the normal way after
super().__setattr__(attr, value)
wrapper_object = CaptureOnSetAttribute()
Конечно, компромисс состоит в том, что теперь вместо записи что-то вроде:
monitored_global = value
Теперь вы должны написать:
wrapper_object.monitored_attribute = value