This is the first example we meet when we face with decorators. But I'm not able to realize what exactly I would like.
A simple decorator named LOG. It should work like this:
@LOG
def f(a, b=2, *c, **d):
pass
And the result should be something like:
f(1, pippo=4, paperino='luca')
===== Enter f =====
a = 1
b = 2
pippo = 4
paperino = luca
===== Exit f =====
Where every argument passed as a parameter to the function is showed with its value.
I discovered that the problem is harder than I thought, mainly because of the many different ways you can pass arguments to a function (think about tuples with *c or dictionaries with **d).
I tried a solution but I'm not sure it's correct. It' somethink like this:
def LOG(fn):
import inspect
varList, _, _, default = inspect.getargspec(fn)
d = {}
if default is not None:
d = dict((varList[-len(default):][i], v) for i, v in enumerate(default))
def f(*argt, **argd):
print ('Enter %s' % fn).center(100, '=')
d.update(dict((varList[i], v) for i, v in enumerate(argt)))
d.update(argd)
for c in d.iteritems():
print '%s = %s' % c
ret = fn(*argt, **argd)
print 'return: %s' % ret
print ('Exit %s' % fn).center(100, '=')
return ret
return f
I think it's not so easy as I expected, but it's strange I didn't found what I wanted on Google.
Can you tell me if my solution is ok? Or can you suggest a better solution to the problem I proposed?
Thank you to everybody.