Discuss / Python / 我结合源码对partial的理解

我结合源码对partial的理解

Topic source

一盒噪噪

#1 Created at ... [Delete] [Delete and Lock User]

partial中return call (返回内层函数)

f=partial()  相当于 f = call

固定的数值传入partial中

不同的参数随每次调用f   传入call中

在call中的return中调用原函数func : return func()

partial的函数原型:partial(func, *args, **kw)

call的函数原型:call(*args, **kw)

*arg  可直接传入参数值,使之依次分配给原 func中的参数,   **kw  需要传入默认参数形式,使之可以直接代替对应的key中的value

return中调用func的实际参数:arg=func.arg+partial.arg+call.arg                  

kw=( ((func.kw.copy())  .update(partia.kw))  .update(call.kw))    #此时需要用原函数中kw的拷贝形式,防止修改了原函数的参数(update可以直接覆盖原先key中的value)

代码如下:

def partial(func, *arg, **kw):

    arg = func.arg + arg

    Kw = func.kw.copy()

    Kw.update(kw)

    def call(*arg, **kw):

        arg=partial.arg+arg

        Kw.update(kw)

        return func(*arg, **Kw)    

    return call

之所以不在call中直接:arg=partial.arg+func.arg+arg   

因为每次调用call函数的时候都需要比上述函数多加一次func.arg

虽然一次两次的效果不明显,但是当需要调用成千上万次的时候,代码执行效率上很大区别了

kw同理

一盒噪噪

#2 Created at ... [Delete] [Delete and Lock User]

在原代码中,用上了类class

由于我们还没有学到,所以很难理解

但是思路类似

只是用和call同级的函数__new__取代了partial的功能(定义默认属性)

一盒噪噪

#3 Created at ... [Delete] [Delete and Lock User]

源代码中:

if hasattr(func, "func"):

        args = func.args + args

        tmpkw = func.keywords.copy()

        tmpkw.update(keywords)

        keywords = tmpkw

        del tmpkw

        func = func.func

keywords 是partial中传入的字典

我不太清楚为什么要把原func中的默认参数跟keywords合并起来(之后还会把实际调用时传入字典跟这个字典合并起来,再在return时作为参数传入原func)

明明在后来return调用func的时候,可以直接覆盖原参数的值,或给对应的参数赋值

像是多此一举一样

有人知道的话麻烦告知

一盒噪噪

#4 Created at ... [Delete] [Delete and Lock User]

如果去掉上述的那一步的话,代码如下:

def partial(func, *arg, **kw):

    Kw = kw.copy()

    def call(*args, **kw):

        Kw.update(kw)

        return func(*arg,*args, **Kw)    

    return call


  • 1

Reply