9

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

如果我想实现一个预先添加附加参数的版本,似乎我只需要更改指示的行。

仅复制此代码时,是否还有其他我应该担心的功能/陷阱?

4

2 回答 2

8

查看 的源代码_functoolsmodule.c,我认为没什么好担心的。

partial处理pickling和的模块实现repr,但其他一切看起来都像文档中的那样工作,所以大概它在 C 中实现的原因只是为了提高效率。还有一个事实是它是一种类型,而不仅仅是一个函数闭包。

但是请注意,在文档示例funcargs, 和keywords纯粹是装饰性的;即它们不能像实际functools.partial实例那样被覆盖。一种替代方法是 subclass functools.partial

class rpartial(partial):
    def __call__(self, *args, **kwargs):
        kw = self.keywords.copy()
        kw.update(kwargs)
        return self.func(*(args + self.args), **kw)
于 2012-08-06T15:50:51.770 回答
0

一个陷阱是您的部分赋值将如何处理任意参数,例如在以下示例中:

def f(a,b, *args):
    pass

现在部分适用f于参数 1 和 2:

g = partial(f, 1, 2)

中的参数值是b多少g?是 1,还是仍在等待值?就此而言, 的价值是a多少?换句话说,提供的参数中有多少(如果有)应该被视为附加参数。

于 2012-08-06T15:41:26.267 回答