假设您有以下代码:
def addTags(functionHere):
def wrapper():
return "NumberTag" + functionHere() + "NumberTagOver"
return wrapper
@addTags
def numbers(firstValue, secondValue):
return firstValue + secondValue
然后将数字(4,5)放入解释器中吐出一条迹线,说包装器不带参数。好的,然后将数字()放入解释器中吐出数字需要两个参数!困惑。
答案 0 :(得分:6)
你的包装函数替换了包装函数,需要匹配它所需的参数个数。你的包装函数有两个参数(firstValue, secondValue)
,但你的包装器根本没有。
您也可以将这两个添加到装饰器包装器中:
def addTags(functionHere):
def wrapper(firstValue, secondValue):
return "NumberTag" + functionHere(firstValue, secondValue) + "NumberTagOver"
return wrapper
但是你的装饰师与那个特定的功能联系在一起。
但是你可以使用一些技巧:
def addTags(functionHere):
def wrapper(*args):
return "NumberTag" + functionHere(*args) + "NumberTagOver"
return wrapper
*args
位置参数作为一个包罗万象,函数的所有位置参数现在都传递给包装函数。
关键字参数也有一个等价物:
def addTags(functionHere):
def wrapper(*args, **kw):
return "NumberTag" + functionHere(*args, **kw) + "NumberTagOver"
return wrapper