【问题标题】:Python function decorator errorPython函数装饰器错误
【发布时间】:2018-01-28 15:29:23
【问题描述】:

我尝试使用函数装饰器,但在这个例子中它对我不起作用,你能给我解决方案吗?

def multiply_by_three(f):
    def decorator():
        return f() * 3
return decorator

@multiply_by_three
def add(a, b):  
    return a + b

print(add(1,2)) # returns (1 + 2) * 3 = 9

解释器打印错误:“TypeError: decorator() 接受 0 个位置参数,但给出了 2 个”

【问题讨论】:

  • 说的是实话。你的decorator 函数不接受任何参数,当你调用add(1,2) 时,你最终会调用decorator(1,2),因为这是你从multiply_by_three 方法返回的。另外,请考虑不要将其称为“装饰器”,因为这样讨论起来会非常混乱(因为multiply_by_three 是实际的装饰器)。

标签: python python-3.x decorator python-decorators


【解决方案1】:

当您使用装饰器时,您从装饰器返回的函数会替换旧函数。换句话说,multiply_by_three 中的decorator 函数替换了add 函数。

这意味着每个函数签名都应该匹配,包括它们的参数。但是,在您的代码中,add 接受两个参数,而 decorator 不接受任何参数。您还需要让decorator 接收两个参数。您可以使用*args and **kwargs 轻松做到这一点:

def multiply_by_three(f):
    def decorator(*args, **kwargs):
        return f(*args, **kwargs) * 3
    return decorator

如果你现在装饰你的函数并运行它,你可以看到它的工作原理:

@multiply_by_three
def add(a, b):  
    return a + b

print(add(1,2)) # 9

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2016-07-25
    • 2019-12-18
    相关资源
    最近更新 更多