Я пытаюсь изменить словарь конфигурации внутри декоратора (так что мне не нужно возиться с кодом самой функции do_something()
). Однако у меня возникают проблемы с «сбросом» словаря в его старое состояние.
Как мне это сделать? И есть ли лучший способ продвижения вперед, чем этот подход (без изменения самого кода do_something()
)?
Я пробовал несколько подходов к размещению переменной CONFIG, но, в конце концов, глобальный контекст никогда не сбрасывался в исходное состояние.
import copy
CONFIG = {
'key': 'value'
}
def alter_dictionary_decorator(function):
def wrapper():
old = copy.deepcopy(CONFIG)
CONFIG['key'] = 'other_value'
func = function()
config = old # <- can't put 'CONFIG = old' here
return func
return wrapper
@alter_dictionary_decorator
def do_something():
print(CONFIG['key'])
if __name__ == '__main__':
print(CONFIG['key'])
do_something()
print(CONFIG['key'])
Ожидаемые результаты = "значение", "другое_значение", "значение"
Результаты Observerd = 'value', 'other_value', 'other_value'
Вам нужно использовать ключевое слово global
, чтобы изменить переменные, имеющие глобальную область действия. Кроме того, config = old
должно было быть CONFIG = old
.
Следующий код работает так, как вам нужно:
import copy
CONFIG = {
'key': 'value'
}
def alter_dictionary_decorator(function):
def wrapper():
global CONFIG
old = copy.deepcopy(CONFIG)
CONFIG['key'] = 'other_value'
func = function()
CONFIG = old
return func
return wrapper
@alter_dictionary_decorator
def do_something():
print(CONFIG['key'])
if __name__ == '__main__':
print(CONFIG['key'])
do_something()
print(CONFIG['key'])
С выходом:
value
other_value
value
Да, этот UnboundLocalError
вызван тем, что он не хочет, чтобы вы изменяли глобальные переменные в локальной области, и решение использует ключевое слово global
.
Большое спасибо. Это действительно исправило это. И вы были правы, одна строка кода в моем примере была неправильной, но это было сделано намеренно, потому что код выдавал ошибки. Я добавил это в исходный пост как раз перед тем, как вы ответили :)