Python之偏函数

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

posted @ 2018-04-20 15:45  亚洲哈登  阅读(539)  评论(0编辑  收藏  举报