[Отказ от ответственности: могут быть другие питонические способы делать то, что я хочу сделать, но я хочу знать, как здесь работает область видимости Python]
Я пытаюсь найти способ сделать декоратор, который делает что-то вроде внедрения имени в область действия другой функции (чтобы имя не просачивалось за пределы области действия декоратора). Например, если у меня есть функция, которая говорит напечатать переменную с именем var
, которая не была определена, я хотел бы определить ее в декораторе, где она вызывается. Вот пример, который ломается:
c = 'Message'
def decorator_factory(value):
def msg_decorator(f):
def inner_dec(*args, **kwargs):
var = value
res = f(*args, **kwargs)
return res
return inner_dec
return msg_decorator
@decorator_factory(c)
def msg_printer():
print var
msg_printer()
Я бы хотел, чтобы он печатал "Message
", но это дает:
NameError: global name 'var' is not defined
Трассировка даже указывает на то, где определено var
:
<ipython-input-25-34b84bee70dc> in inner_dec(*args, **kwargs)
8 def inner_dec(*args, **kwargs):
9 var = value
---> 10 res = f(*args, **kwargs)
11 return res
12 return inner_dec
Поэтому я не понимаю, почему он не может найти var
.
Есть ли способ сделать что-то подобное?