KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
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.
Tags (comma-separated)
Save Edits
Cancel