对于文档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
如果我想要实现的是预先考虑的附加参数的版本,好像我只需要改变指定的行。
是否有任何其他功能/陷阱,我应该担心的只是复制这个代码?
综观的源代码_functoolsmodule.c
,我不认为有什么可担心的。
的模块实现partial
手柄酸洗和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)
一个缺陷是你的部分转让将如何处理任意参数,如下面的例子:
def f(a,b, *args):
pass
现在,部分申请f
到参数1和2:
g = partial(f, 1, 2)
什么是参数的值b
在g
? 它是1,或者是仍在等待价值? 对于这个问题,什么是价值a
? 换句话说,有多少,如果有的话,提供的参数应被视为额外的参数。