如何为 functoolpartial() 指定 arg 位置

ala*_*tti 6 python lambda decorator currying

根据手册,functools partial()用于部分函数应用程序,其中 \xe2\x80\x9c 冻结 \xe2\x80\x9d 函数的某些部分\xe2\x80\x99s 参数和/或关键字,从而产生具有简化签名的新对象。 '

\n\n

指定想要评估的论点位置的最佳方式是什么?

\n\n

编辑

\n\n

请注意,根据注释,要部分求值的函数可能包含命名和未命名参数(这些函数应该是完全任意的,并且可能是预先存在的)

\n\n

结束编辑

\n\n

例如,考虑:

\n\n
def f(x,y,z):\n    return x + 2*y + 3*z \n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,使用

\n\n
from functools import partial\n
Run Code Online (Sandbox Code Playgroud)\n\n

两个都

\n\n
partial(f,4)(5,6)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
partial(f,4,5)(6)\n
Run Code Online (Sandbox Code Playgroud)\n\n

给 32。

\n\n

但是,如果要计算第三个参数z或第一个和第三个参数x, 和 ,该怎么办z

\n\n

有没有一种方便的方法来将位置信息传递给partial,使用 adecorator或 a ,dict其键是所需的 arg 位置,相应的值是 arg 值?例如传递xz位置,如下所示:

\n\n
partial_dict(f,{0:4,2:6})(5)\n
Run Code Online (Sandbox Code Playgroud)\n

blh*_*ing 4

不,partial不是为了冻结非连续位置的位置参数而设计的。

为了实现问题中概述的所需行为,您必须提出自己的包装函数,如下所示:

def partial_positionals(func, positionals, **keywords):
    def wrapper(*args, **kwargs):
        arg = iter(args)
        return func(*(positionals[i] if i in positionals else next(arg)
            for i in range(len(args) + len(positionals))), **{**keywords, **kwargs})
    return wrapper
Run Code Online (Sandbox Code Playgroud)

以便:

def f(x, y, z):
    return x + 2 * y + 3 * z

print(partial_positionals(f, {0: 4, 2: 6})(5))
Run Code Online (Sandbox Code Playgroud)

输出:

32
Run Code Online (Sandbox Code Playgroud)