Python 将全局值作为参数传递给装饰器和函数

Python 将全局值作为参数传递给装饰器和函数,python,arguments,global,decorator,Python,Arguments,Global,Decorator,我是python新手,学习装饰程序。没有参数和有参数(如字符串)的装饰器看起来很简单。但是,如果我想传递一个全局值而不是“srting”作为参数,它将失败。我所有这些都是不同的文件,所以我想使用全局变量 File1: def decorator(arg1, arg2): def real_decorator(function): def wrapper(*args): print "i am decorated" print

我是python新手,学习装饰程序。没有参数和有参数(如字符串)的装饰器看起来很简单。但是,如果我想传递一个全局值而不是“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
File1:
def装饰器(arg1、arg2):
def real_装饰器(功能):
def包装(*args):
打印“我被装饰”
打印arg1、arg2
函数(*args)
返回包装器
返回真正的装饰
文件2:
def glob(a、b):
全局arg1
arg1=a
全局arg2
arg2=b
@decorator(arg1,arg2)#将其作为“字符串”传递,即('arg1','arg2')它传递,正如我所展示的那样传递,它失败了
def打印参数(*参数):
打印“我很普通”
对于args中的arg:
打印参数
文件3:
#调用函数
全球(1,2)
打印参数(3,4,5)
======================================
通过:(当作为字符串给出时)
我被授予勋章
arg1 arg2
我是普通人
3.
4.
5.
======================================
失败:(当给定全局var时)
回溯(最近一次呼叫最后一次):
文件“/User/File2.py”,第19行,在
@装饰器(arg1、arg2)
NameError:未定义全局名称“arg1”

非常感谢您的帮助。从昨天起我就一直在做这件事

您应该在零缩进级别声明
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)

此外,在将
arg1
arg2
作为装饰器的参数传递之前,请确保调用
glob(1,2)

但是我正在从@decorator(arg1,arg2)发送arg1和arg2。我不想再次初始化该值。。我遗漏了什么吗?@h_vm,是的,遗漏的是它们没有在全局范围内定义,因此
@decorator(arg1,arg2)
正是您得到错误的那一行,因为这些变量没有声明。当我将全局变量定义为(arg1=None,arg2=None)时,它只为arg1和arg2打印“None”。@h_vm,你这是什么意思?它的印刷:我是装饰的\n没有\n 1 2\n我是普通的\n 3\n 4\n 5\n