python decorators,嵌套函数

时间:2015-04-06 15:44:35

标签: python python-decorators

我试图找出为什么在使用装饰器时我需要一个更多的嵌套函数。这是一个例子:

 def func(f):
    def deco(*args, **kwargs):
        return f(*args, **kwargs)
    return deco

@func
def sum(a, b):
    return a+b

print sum(5, 10)

代码有效,一切都很好。但为什么我需要创建嵌套" deco"功能? 让我们试试没有它:

def func(f):
    return f(*args, **kwargs)

@func
def sum(a, b):
    return a+b

print sum(5, 10)

代码失败。

所以有三个问题:

  1. 为什么第二个样本不起作用?
  2. 为什么args,kwargs"神奇地"如果我们使用嵌套函数会出现?
  3. 我能做些什么,让第二个样本工作?除了嵌套另一个函数,当然。

1 个答案:

答案 0 :(得分:3)

  1. 为什么第二个样本不起作用?

    因为您在返回时调用该函数,所以您没有返回函数。

  2. 为什么args,kwargs"神奇地"如果我们使用嵌套函数会出现?

    他们不会神奇地出现,我们正在声明他们,如:

    def deco(*args, **kwargs):
    

    这些是通用的,并且将匹配任何函数签名(参数列表)。您不必给他们argskwargs打电话,这只是一个约定,您可以称他们为sharontracy

  3. 我能做些什么,让第二个样本工作?除了嵌套另一个函数,当然。

    嗯,你不能说出你对第二个样本的期望。但我想把它变成装饰者然后:

    def func(f):
        return f
    

    但那并没有做很多事情!

  4. 顺便说一句,覆盖现有的Python内置函数(sum)通常是一个坏主意 - 你必须有一个很好的理由。