【发布时间】:2017-08-25 02:06:40
【问题描述】:
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 为函数创建所需的签名,但我很难将新签名分配给函数。我正在尝试使用签名。bind 我已经阅读了docs,但我遗漏了一些东西。
编辑
结合 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__属性? -
不可否认,我想我希望避免手动操作,让 Signature 类处理它
标签: python decorator signature