Python 3.6
我正在尝试创建一个装饰器,自动将参数的字符串分配为默认值。
例如:
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
创建函数所需的签名,但我在尝试将新签名分配给函数时遇到了困难。我正在尝试使用 Signature.bind
。我已经阅读了文档,但我似乎还是漏掉了什么。
编辑
结合 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)
__defaults__
属性吗? - Ignacio Vazquez-Abrams