function decorator-like function

V

vsoler

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

Patrick Maupin

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?
.... def wrapper(*args):
.... print 3
.... return f(*args)
.... return wrapper
........ print a + b
....3
12

HTH,
Pat
 
V

vsoler

...     def wrapper(*args):
...         print 3
...         return f(*args)
...     return wrapper
...>>> def f(a, b):

...     print a + b
...>>> f = d(f)

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
 
V

vsoler

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
 
P

Patrick Maupin

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
 
M

Michele Simionato

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)

@d
def f(a, b):
print a + b

f(5, 7)
 
P

Patrick Maupin

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)

@d
def f(a, b):
    print a + b

f(5, 7)

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top