Я новичок в python и обучении декораторов. Декораторы с аргументами NO и аргументами WITH (как строка) кажутся прямолинейными. Но, однако, если я хочу передать глобальное значение вместо «srting» в качестве аргументов, он терпит неудачу. У меня все это разные файлы, поэтому я хочу использовать глобальную переменную.Передача глобального значения в качестве аргумента декоратору и функции
File1:
def decorator(arg1, arg2):
def real_decorator(function):
def wrapper(*args):
print "i am decorated"
print arg1, arg2
function(*args)
return wrapper
return real_decorator
File2:
def glob(a, b):
global arg1
arg1 = a
global arg2
arg2 = b
@decorator(arg1, arg2) # pass it as 'string' ie('arg1', 'arg2') it PASSES, pass it as i have showed, it FAILS
def print_args(*args):
print 'i am ordinary'
for arg in args:
print arg
File3:
#calling functions
glob(1, 2)
print_args(3,4,5)
======================================
Pass: (when given as string)
i am decorated
arg1 arg2
i am ordinary
3
4
5
======================================
Fail: (when given global var)
Traceback (most recent call last):
File "/User/File2.py", line 19, in <module>
@decorator(arg1, arg2)
NameError: global name 'arg1' is not defined
Любая помощь с этой оценкой. Я застрял с этим со вчерашнего дня. !!
Но я отправляю arg1 и arg2 из @decorator (arg1, arg2). Я не хочу снова инициализировать значение. Я что-то пропустил. –
@h_vm, да, недостаток в том, что они не определены в глобальной области, поэтому '@decorator (arg1, arg2)' - это точно линия, в которой вы получаете ошибку, поскольку эти переменные не объявлены. – lmiguelvargasf
Он печатает «Нет» только для arg1 и arg2, когда я определяю глобальный var as (arg1 = None и arg2 = None). –