装饰器:如何将参数传递给包装函数?

时间:2014-01-19 16:36:16

标签: python decorator

我有以下装饰器示例

def makeitalic(f):
    def wrapped(*args, **kwargs):     
       return "<I>" + f(args[0]) + "</I>"
    return wrapped

def myprint(text):
    return text


myprint = makeitalic(myprint)
print myprint('hii')

Output:
<I>hii</I>

包装函数(内部函数)如何获取原函数的参数?

2 个答案:

答案 0 :(得分:2)

包装函数获取原始函数的参数。它得到了它可以(并且通常会)选择传递给原始函数的参数。

执行myprint = makeitalic(myprint)时,名称myprint现在引用包装函数。它不再引用前面定义的函数myprint

因此,当您调用myprint('hii')时,您正在调用包装函数。原始函数还没有参数,因为它从未被调用过。

wrapped内,您拨打f。这是原始函数,您将args[0]传递给它'hii'。所以,现在调用原始函数。它获取包装函数的第一个参数,因为这是您选择传递它的原因。

答案 1 :(得分:-1)

thefourtheye已经与完整的解释相关联,所以这里是可以回答你问题的最短解释:(*args, **kwargs)表示传递给wrapped函数的所有参数。 args是一个元组,kwargs是一个字典。因此,当wrapped函数引用args[0]时,它意味着“传递的第一个参数。