python修饰符decorator ,嵌套函数

python decorators, nested function

本问题已经有最佳答案,请猛点这里访问。

我想知道为什么在使用decorator时还需要一个嵌套函数。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
 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"函数呢?让我们试着不使用它:

1
2
3
4
5
6
7
8
def func(f):
    return f(*args, **kwargs)

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

print sum(5, 10)

代码失败。

所以有三个问题:

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

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

    因为您在返回时调用函数,所以不会返回函数。

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

    它们不会神奇地出现,我们要宣布它们,如:

    1
    def deco(*args, **kwargs):

    这些是通用的,并且将匹配任何函数签名(参数列表)。你不必叫他们argskwargs,这只是一个惯例,你可以叫他们sharontracy

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

    好吧,你不会说你希望第二个样本做什么。但是我想把它变成一个装饰师然后:

    1
    2
    def func(f):
        return f

    但那没什么用!

  • 顺便说一句,重写现有的python内置(sum)通常是一个坏主意——您必须有一个非常好的理由。