【问题标题】:implementing functools.partial that prepends additional arguments实现附加参数的 functools.partial
【发布时间】:2012-08-06 15:16: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

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

在复制此代码时,我还应该担心其他任何功能/问题吗?

【问题讨论】:

    标签: python functools


    【解决方案1】:

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

    partial 的模块实现处理 picklingrepr,但其他一切看起来都与文档中的一样,所以大概它在 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), **kw)
    

    【讨论】:

    • 没想过继承内置函数。
    • 这很好,但我认为它应该是:class rpartial(partial):def __call__(self, *args, **kwargs): kw = self.keywords.copy() kw.update (kwargs) return self.func(*(args + self.args), **kw)
    【解决方案2】:

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

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

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

    g = partial(f, 1, 2)
    

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

    【讨论】:

    • 这是一个很好的评论,但我会声明语法表示g() == f(1,2); g(x)==f(x,1,2); g(x,y)==f(x,y,1,2) 等等。这可能很奇怪,但却是系统性的。
    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 2021-11-22
    • 2013-02-22
    • 2011-05-27
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多