Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

function decorator-like function

0 views
Skip to first unread message

vsoler

unread,
Mar 27, 2010, 11:24:26 AM3/27/10
to
Hi,

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?

Patrick Maupin

unread,
Mar 27, 2010, 12:06:40 PM3/27/10
to

>>> 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

vsoler

unread,
Mar 27, 2010, 12:21:06 PM3/27/10
to

Pat,

I think some lines are missing. I don't see "d" function defined. Any
lines above def wrapper?

Thank you

vsoler

unread,
Mar 27, 2010, 12:24:51 PM3/27/10
to

Patrick,

I see what happened. The first line was somehow hidden.
Thank you very much.

Vicente Soler

Patrick Maupin

unread,
Mar 27, 2010, 2:07:47 PM3/27/10
to
On Mar 27, 11:24 am, vsoler <vicente.so...@gmail.com> wrote:
> I see what happened. The first line was somehow hidden.
> Thank you very much.

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

Michele Simionato

unread,
Mar 28, 2010, 10:17:24 AM3/28/10
to
Another option is to use my own decorator module (http://
pypi.python.org/pypi/decorator):

from decorator import decorator

@decorator
def d(func, *args):
print 3
return func(*args)

Patrick Maupin

unread,
Mar 28, 2010, 12:26:39 PM3/28/10
to
On Mar 28, 9:17 am, Michele Simionato <michele.simion...@gmail.com>
wrote:

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

0 new messages