我有以下装饰器示例
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>
包装函数(内部函数)如何获取原函数的参数?
答案 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]
时,它意味着“传递的第一个参数。