我结合源码对partial的理解
Topic source源代码中:
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的时候,可以直接覆盖原参数的值,或给对应的参数赋值
像是多此一举一样
有人知道的话麻烦告知
如果去掉上述的那一步的话,代码如下:
def partial(func, *arg, **kw):
Kw = kw.copy()
def call(*args, **kw):
Kw.update(kw)
return func(*arg,*args, **Kw)
return call
- 1
一盒噪噪
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同理