This is how you can build the actual parameters list in the decorator:
import inspect
class Inspector:
def __init__(self, passedFunc):
self.passedFunc = passedFunc
def __call__(self, *args, **kwargs):
spec = inspect.getargspec(self.passedFunc)
params = dict(zip(spec.args, args))
defaults = dict(zip(spec.args[-len(spec.defaults):], spec.defaults))
for k, v in kwargs.items():
if k not in spec.args:
raise TypeError('unexpected argument', k)
if k in params:
raise TypeError('mulitple values for argument', k)
params[k] = v
for k in spec.args:
if k not in params:
if k in defaults:
params[k] = defaults[k]
else:
raise TypeError('missing argument', k)
args_in_order = [params[x] for x in spec.args]
print args_in_order
Example:
@Inspector
def exampleFunc(value=0, otherValue=3):
pass
exampleFunc() # 0,3
exampleFunc('foo') # foo,3
exampleFunc(otherValue='foo', value=555) # 555,foo