0

假设您有以下代码:

def addTags(functionHere):
    def wrapper():
        return "NumberTag" + functionHere() + "NumberTagOver"
    return wrapper

@addTags
def numbers(firstValue, secondValue):
    return firstValue + secondValue

然后将 numbers(4, 5) 放入解释器会吐出一条痕迹,说明 wrapper 不接受任何参数。好的,然后将 numbers() 放入解释器会吐出 numbers 需要两个参数!使困惑。

4

1 回答 1

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
于 2013-03-15T17:54:57.827 回答