Python中的装饰器

Edg*_*ian 0 python decorator python-2.7 python-decorators

假设您有以下代码:

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

@addTags
def numbers(firstValue, secondValue):
    return firstValue + secondValue
Run Code Online (Sandbox Code Playgroud)

然后将数字(4,5)放入解释器中吐出一条迹线,表示包装器不带参数.好的,然后将数字()放入解释器中吐出数字需要两个参数!困惑.

Mar*_*ers 6

您的包装函数替换了包装函数,并且需要匹配它所包含的参数数量.你的包装函数有两个参数(firstValue, secondValue),但你的包装器根本没有参数.

您也可以将这两个添加到装饰器包装器中:

def addTags(functionHere):
    def wrapper(firstValue, secondValue):
        return "NumberTag" + functionHere(firstValue, secondValue) + "NumberTagOver"
    return wrapper
Run Code Online (Sandbox Code Playgroud)

但是这会将你的装饰者与特定的功能联系起来.

但是你可以使用一些技巧:

def addTags(functionHere):
    def wrapper(*args):
        return "NumberTag" + functionHere(*args) + "NumberTagOver"
    return wrapper
Run Code Online (Sandbox Code Playgroud)

*args位置参数作为一个包罗万象的,对该函数的所有位置参数,现在传递到包装的函数.

关键字参数也有一个等价物:

def addTags(functionHere):
    def wrapper(*args, **kw):
        return "NumberTag" + functionHere(*args, **kw) + "NumberTagOver"
    return wrapper
Run Code Online (Sandbox Code Playgroud)