通过d更改类内函数的签名

2024-05-07 12:39:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经有了一个类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(存储在tuplesiglist

我在Python食谱中发现:

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)>

但是在课堂上呢?你知道吗


Tags: debugtestselfgetparametervardefargs