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

Dav*_*ave 8 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
Run Code Online (Sandbox Code Playgroud)

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

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

eca*_*mur 6

看一下源代码_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)
Run Code Online (Sandbox Code Playgroud)