实施functools.partial是预先考虑额外的参数(implementing functoo

2019-07-30 19:36发布

对于文档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

如果我想要实现的是预先考虑的附加参数的版本,好像我只需要改变指定的行。

是否有任何其他功能/陷阱,我应该担心的只是复制这个代码?

Answer 1:

综观的源代码_functoolsmodule.c ,我不认为有什么可担心的。

的模块实现partial手柄酸洗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)


Answer 2:

一个缺陷是你的部分转让将如何处理任意参数,如下面的例子:

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

现在,部分申请f到参数1和2:

g = partial(f, 1, 2)

什么是参数的值bg ? 它是1,或者是仍在等待价值? 对于这个问题,什么是价值a ? 换句话说,有多少,如果有的话,提供的参数应被视为额外的参数。



文章来源: implementing functools.partial that prepends additional arguments