问题
I'm trying to figure out why i need a one more nested function when using decorators. Here is an example:
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)
Code works, everything is fine. But why do i need to create nested "deco" function? Let's try without it:
def func(f):
return f(*args, **kwargs)
@func
def sum(a, b):
return a+b
print sum(5, 10)
Code fails.
So there are three questions:
- Why second sample does not works?
- Why args,kwargs are "magically" appears if we are using a nested function?
- What can i do, to make 2nd sample work? Except nesting another function, ofcourse.
回答1:
Why second sample does not works?
Because you are calling the function on the return, you are not returning a function.
Why args,kwargs are "magically" appears if we are using a nested function?
They don't appear magically, we are declaring them, as in:
def deco(*args, **kwargs):
These are generic, and will match any function signature (argument list). You don't have to call them
args
andkwargs
, that's just a convention, you could call themsharon
andtracy
.What can i do, to make 2nd sample work? Except nesting another function, ofcourse.
Well you don't say what you expect the 2nd sample to do. But I guess to turn it into a decorator then:
def func(f): return f
But that's not doing a lot!
By the way, it is usually a bad idea to override an existing Python builtin (sum
) - you have to have a very good reason for that.
来源:https://stackoverflow.com/questions/29474539/python-decorators-nested-function