Python 3.6
我正在尝试创建一个装饰器,自动将参数的字符串指定为默认值。
such as:
def example(one='one', two='two', three='three'):
pass
相当于:
@DefaultArguments
def example(one, two, three):
pass
这是我的尝试(不起作用..还..)DefaultArguments
:
from inspect import Parameter, Signature, signature
class DefaultArguments(object):
@staticmethod
def default_signature(signature):
def default(param):
if param.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.POSITIONAL_ONLY):
return param.replace(default=param.name)
else:
return param
return Signature([default(param) for param in signature.parameters.values()])
def __init__(self, func):
self.func = func
self.sig = self.default_signature(signature(func))
def __call__(self, *args, **kwargs):
arguments = self.sig.bind(*args, **kwargs)
return self.func(arguments)
静态方法default_signature
为该函数创建所需的签名,但我很难将新签名分配给该函数。我正在尝试使用签名。bind
我读过docs https://docs.python.org/3/library/inspect.html但我错过了一些东西。
EDIT
结合 Ashwini Chaudhary 的回答:
from inspect import Parameter, Signature, signature
class DefaultArguments(object):
@staticmethod
def default_signature(signature):
def default(param):
if param.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.POSITIONAL_ONLY):
return param.replace(default=param.name)
else:
return param
return Signature([default(param) for param in signature.parameters.values()])
def __init__(self, func):
self.func = func
self.sig = self.default_signature(signature(func))
print(self.sig)
def __call__(self, *args, **kwargs):
ba = self.sig.bind(*args, **kwargs)
ba.apply_defaults()
return self.func(*ba.args, **ba.kwargs)