实现其他前缀参数的functools.partial

时间:2012-08-06 15:16:36

标签: python functools

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 附加参数的版本, 好像我只需要更改指示的行。

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

2 个答案:

答案 0 :(得分:6)

查看_functoolsmodule.c的源代码,我认为不用担心。

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

但请注意,在文档示例中,funcargskeywords纯粹是装饰性的;它们不像实际的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的价值是多少?换句话说,提供的参数中有多少(如果有的话)应被视为附加参数。