我已经有一个类poly()
和一个方法get_function()
class poly():
def __init__(self,n):
func = ''
var = []
for i in range(n + 1):
func += ('k'+str(i)) + ' * '+ 'x ** ' + str(i) + ' + '
var.append('k'+str(i))
func = func[:-3]
self.func_str = func
self.var = var
siglist = var.copy()
siglist.append('x')
self.siglist = tuple(siglist)
def get_function(self, *args):
return eval(self.func_str)
现在我要做的是将self.siglist
传递给get_function
的签名以供将来使用(scipy.optimize.curve_fit
需要__signature__
进行曲线拟合)
我跑了
pol = poly(2)
inspect.signature(pol.get_function)
它表明该函数的签名为<Signature (*args)>
但是我想将签名从*args
更改为k0, k1, x
(存储在元组siglist
中)
我在Python Cookbook中发现的是:
from functools import wraps
import inspect
def optional_debug(func):
@wraps(func)
def wrapper(*args, debug=False, **kwargs):
return func(*args, **kwargs)
sig = inspect.signature(func)
parms = list(sig.parameters.values())
# what is inspect.Parameter.KEYWORD_ONLY do ?
parms.append(inspect.Parameter('debug', inspect.Parameter.KEYWORD_ONLY, default=False))
wrapper.__signature__ = sig.replace(parameters=parms)
return wrapper
@optional_debug
def test(input):
pass
print(inspect.signature(test))
此函数能够更改函数的签名,结果是:
(input, *, debug=False)
如果我将装饰器放在类之外,如何通过self.siglist
来编辑签名,为什么在使用装饰器进行更改后签名中会有*
?
________________如果某个函数不在类中,则要编辑__signature__
___________
def make_sig(*names):
parms = [Parameter(name, Parameter.POSITIONAL_OR_KEYWORD)
for name in names]
return Signature(parms)
def test():
pass
ls = ('a','b')
test.__signature__ = make_sig(*ls)
inspect.signature(test)
获取:
<Signature (a, b)>
但是在班级里呢?