2017-02-17 29 views
1

Я новичок в 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 

Любая помощь с этой оценкой. Я застрял с этим со вчерашнего дня. !!

ответ

1

Вы должны объявить arg1 и arg2 на уровне нулевого отступа, т.е. в качестве глобальной переменной внутри модуля:

arg1 = None 
arg2 = None 

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 

def glob(a, b): 
    global arg1 
    arg1 = a 
    global arg2 
    arg2 = b 

glob(1, 2) 

#calling functions 
@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) 


print_args(3,4,5) 

Кроме того, убедитесь, чтобы позвонить glob(1, 2) перед передачей arg1 и arg2 в качестве параметров вашего декоратора.

+0

Но я отправляю arg1 и arg2 из @decorator (arg1, arg2). Я не хочу снова инициализировать значение. Я что-то пропустил. –

+0

@h_vm, да, недостаток в том, что они не определены в глобальной области, поэтому '@decorator (arg1, arg2)' - это точно линия, в которой вы получаете ошибку, поскольку эти переменные не объявлены. – lmiguelvargasf

+0

Он печатает «Нет» только для arg1 и arg2, когда я определяю глобальный var as (arg1 = None и arg2 = None). –