python中partial函数的源码看不懂的地方。

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

主要是这部分:

   newfunc.func = func
   newfunc.args = args
   newfunc.keywords = keywords

想问

newfunc 是调用了 newfunc() 这个函数,然后返回了 func() 函数调用的结果,
那么给 newfunc.func/newfunc.args 赋值又是什么意思?
是给返回的 func() 函数的调用结果的属性赋值吗?

阅读 3.1k
2 个回答
新手上路,请多包涵

为了便于直接拿到初始函数,比如:
import functools
int2 = functools.partial(int, base=2)
如果int2这个函数名换成sdfasdf这样一个不容易看出来的变量名,就可以直接用sdfasdf.func来返回初始变量的名字。

有点类似于func.__name__

我试了试没有这两行赋值也是可以的。

In [23]: def add(a,b = 1):
    ...:     return a + b
    ...:

In [24]: def partial(func, *args, **keywords):
    ...:     def newfunc(*fargs, **fkeywords):
    ...:         newkeywords = keywords.copy()
    ...:         newkeywords.update(fkeywords)
    ...:         return func(*args, *fargs, **newkeywords)
    ...:     return newfunc
    ...:

In [25]: add_on_1 = partial(add,1)

In [26]: add_on_1(1)
Out[26]: 2

In [27]: add_on_1(2)
Out[27]: 3

In [28]: add2 = partial(add, b = 2)

In [29]: add2(3)
Out[29]: 5

大概是为了保留函数的参数信息。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进