我试图找出为什么在使用装饰器时我需要一个更多的嵌套函数。这是一个例子:
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)
代码失败。
所以有三个问题:
答案 0 :(得分:3)
为什么第二个样本不起作用?
因为您在返回时调用该函数,所以您没有返回函数。
为什么args,kwargs"神奇地"如果我们使用嵌套函数会出现?
他们不会神奇地出现,我们正在声明他们,如:
def deco(*args, **kwargs):
这些是通用的,并且将匹配任何函数签名(参数列表)。您不必给他们args
和kwargs
打电话,这只是一个约定,您可以称他们为sharon
和tracy
。
我能做些什么,让第二个样本工作?除了嵌套另一个函数,当然。
嗯,你不能说出你对第二个样本的期望。但我想把它变成装饰者然后:
def func(f):
return f
但那并没有做很多事情!
顺便说一句,覆盖现有的Python内置函数(sum
)通常是一个坏主意 - 你必须有一个很好的理由。