[Отказ от ответственности: может быть больше pythonic способов делать то, что я хочу сделать, но я хочу знать, как работает область обзора 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()
Я бы хотел, чтобы он печатал "Сообщение", но он дает:
NameError: global name 'var' is not defined
Определяется трассировка даже на wher 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
.
Есть ли способ сделать что-то вроде этого?