apply_defaults BoundArguments .
BoundArguments args kwargs.
def __call__(self, *args, **kwargs):
ba = self.sig.bind(*args, **kwargs)
ba.apply_defaults()
return self.func(*ba.args, **ba.kwargs)
Demo:
>>> @DefaultArguments
... def example(one, two, three):
... print(one, two, three)
...
>>> example()
one two three
>>> example('spam')
spam two three
>>> example(one='spam', three='eggs')
spam two eggs
, :
from functools import wraps
from inspect import Parameter, Signature, signature
def default_arguments(func):
def default(param):
if param.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.POSITIONAL_ONLY):
param = param.replace(default=param.name)
return param
sig = Signature([default(param) for param in signature(func).parameters.values()])
@wraps(func)
def wrapper(*args, **kwargs):
ba = sig.bind(*args, **kwargs)
ba.apply_defaults()
return func(*ba.args, **ba.kwargs)
wrapper.__signature__ = sig
return wrapper
Demo:
>>> from inspect import getfullargspec
>>> @default_arguments
... def example(one, two, three):
... print(one, two, three)
...
>>> getfullargspec(example)
FullArgSpec(
args=['one', 'two', 'three'],
varargs=None,
varkw=None,
defaults=('one', 'two', 'three'),
kwonlyargs=[], kwonlydefaults=None, annotations={}
)