1.1偏函数
偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一 个新的函数并返回 从partial生成的新函数,是对原函数的封装
1.2partial的核心代码
def partial(func,*args,**keywords): def newfunc(*fargs,**fkeywords): #包装函数 newkeywords = keywords.copy() newkeywords.update(fkeywords) return func(*(args + fargs),**newkeywords) newfunc.func = func #保留原函数 newfunc.args = args #保留原函数的位置参数 newfunc.keywords = keywords #保留原函数的关键字参数 return newfunc def add(x,y): return x+y partial(add,x=4).func #对保留原函数的使用 foo = partial(add,x=4) foo(y=5)
1.3partial的使用
import functools from functools import partial import inspect def add(x,y)->int: return x+y new_add = partial(add,y=5) sig_p = inspect.signature(new_add) params_p = sig_p.parameters params_p #mappingproxy({'x': <Parameter "x">, 'y': <Parameter "y=5">}) import functools import inspect def add_p1(x,y,*args): return x+y add_p1 = functools.partial(add_p1,1,3,6,5) add_p1(9,10,y=20,x=26) #TypeError: add_p1() got multiple values for argument 'y' sig_p1=inspect.signature(add_p1) params_p1 = sig_p1.parameters params_p1 #mappingproxy({'args': <Parameter "*args">})
总结:partial传入关键字参数,inspect.signature会保留这个参数签名;patical传入位置参数的时候,函数签名不会保留这个位置参数,所以第二个例子签名只有*args