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\ndef f(x,y,z):\n return x + 2*y + 3*z \nRun Code Online (Sandbox Code Playgroud)\n\n然后,使用
\n\nfrom functools import partial\nRun Code Online (Sandbox Code Playgroud)\n\n两个都
\n\npartial(f,4)(5,6)\nRun Code Online (Sandbox Code Playgroud)\n\n和
\n\npartial(f,4,5)(6)\nRun Code Online (Sandbox Code Playgroud)\n\n给 32。
\n\n但是,如果要计算第三个参数z或第一个和第三个参数x, 和 ,该怎么办z?
有没有一种方便的方法来将位置信息传递给partial,使用 adecorator或 a ,dict其键是所需的 arg 位置,相应的值是 arg 值?例如传递x和z位置,如下所示:
partial_dict(f,{0:4,2:6})(5)\nRun Code Online (Sandbox Code Playgroud)\n
不,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)