functools.partial的文档说它“大致相当于”:
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords) # line to change
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
如果我想实现一个 prepends 附加参数的版本, 好像我只需要更改指示的行。
在复制此代码时,我是否应该担心其他功能/陷阱?
答案 0 :(得分:6)
查看_functoolsmodule.c
的源代码,我认为不用担心。
partial
的模块实现处理 pickling 和repr
,但其他所有内容看起来都像文档中那样工作,所以可能是它在C中实现的原因只是为了效率。还有一个事实是它是一种类型,而不仅仅是一个函数闭包。
但请注意,在文档示例中,func
,args
和keywords
纯粹是装饰性的;它们不像实际的functools.partial
实例那样是可覆盖的。另一种选择是子类functools.partial
:
class rpartial(partial):
def __call__(self, *args, **kwargs):
kw = self.keywords.copy()
kw.update(kwargs)
return self.func(*(args + self.args), **kwargs)
答案 1 :(得分:0)
一个缺陷是您的部分赋值将如何处理任意参数,例如以下示例:
def f(a,b, *args):
pass
现在将f
部分应用于参数1和2:
g = partial(f, 1, 2)
b
中参数g
的值是多少?它是1还是仍在等待价值?就此而言,a
的价值是多少?换句话说,提供的参数中有多少(如果有的话)应被视为附加参数。