Still learning Python, now decorators.
Before diving deeply into decorators, I'd like to apply a function to
another function.
My "extremely simple function" should print number 3, then the sum of
its 2 arguments.
Say that I call f(5,7)
I'd like to get, somehow, 3 then 12.
I've tried the following:
def d(f):
print 3
return f
def f(a, b):
print a+b
f=d(f)
However, it does not work. Calling f(5,7) only returns 12, (3 is
missing)
How should I proceed?
>>> def d(f):
... def wrapper(*args):
... print 3
... return f(*args)
... return wrapper
...
>>> def f(a, b):
... print a + b
...
>>> f = d(f)
>>> f(5, 7)
3
12
HTH,
Pat
Pat,
I think some lines are missing. I don't see "d" function defined. Any
lines above def wrapper?
Thank you
Patrick,
I see what happened. The first line was somehow hidden.
Thank you very much.
Vicente Soler
You're welcome. Sorry about the formatting. Also, note that if your
decorator is complicated, you might want to use a class instead of a
nested function. Here's the same thing, using a class (and using the
actual decorator syntax):
class d(object):
def __init__(self, func):
self.func = func
def __call__(self, *args):
print 3
return self.func(*args)
@d
def f(a, b):
print a + b
f(5, 7)
Pat
from decorator import decorator
@decorator
def d(func, *args):
print 3
return func(*args)
That looks cool (and I'm glad you mentioned it), but it appeared to me
the OP was trying to manually construct the equivalent of a decorator
without the "@" syntax, in order to gain an understanding of how
decorators work, and for this particular purpose, piling additional
magic on top of decorators is probably not helpful :-)
Regards,
Pat