I am new to python and decorators, and I am confused about writing a decorator that reports not only passed args and kwargs, but also immutable kwargs by default.
This is what I still have.
def document_call(fn):
def wrapper(*args, **kwargs):
print 'function %s called with positional args %s and keyword args %s' % (fn.__name__, args, kwargs)
return fn(*args, **kwargs)
return wrapper
@document_call
def square(n, trial=True, output=False):
if not output:
print 'no output'
if trial:
print n*n
square(6)
36
square(7,output=True)
49
The "problem" is that this decorator reports arguments that are passed in the call with a square, but do not report the default values defined in the quadratic definition. The only way to tell kwargs is if they are changed from their default values, i.e. transferred to a square call.
Any recommendations on how I can get quarts in a quadratic definition are also reported?
, . , , , .
import inspect
def document_call(fn):
def wrapper(*args, **kwargs):
argspec = inspect.getargspec(fn)
n_postnl_args = len(argspec.args) - len(argspec.defaults)
passed = {k:v for k,v in zip(argspec.args[n_postnl_args:], args[n_postnl_args:])}
passed.update({k:v for k,v in kwargs.iteritems()})
print 'function %s called with \n positional args %s\n passed kwargs %s\n default kwargs %s' % (
fn.__name__, {k:v for k,v in zip(argspec.args, args[:n_postnl_args])},
passed,
{k:v for k,v in zip(argspec.args[n_postnl_args:], argspec.defaults) if k not in passed})
return fn(*args, **kwargs)
return wrapper
. . !