【发布时间】:2020-03-02 20:59:01
【问题描述】:
根据手册,functoolspartial() '用于部分函数应用程序,它“冻结”函数参数和/或关键字的某些部分,从而产生具有简化签名的新对象。'
指定希望评估的参数位置的最佳方法是什么?
编辑
注意,根据 cmets,要部分评估的函数可能包含命名和未命名参数(这些函数应该是完全任意的,并且可能是预先存在的)
结束编辑
例如,考虑:
def f(x,y,z):
return x + 2*y + 3*z
然后,使用
from functools import partial
两者
partial(f,4)(5,6)
和
partial(f,4,5)(6)
给 32。
但是如果想要评估,比如第三个参数z 或第一个和第三个参数x 和z,该怎么办?
有没有一种方便的方法可以将位置信息传递给partial,使用decorator 或dict,其键是所需的arg 位置,相应的值是arg 值?例如传递x 和z 位置,如下所示:
partial_dict(f,{0:4,2:6})(5)
【问题讨论】:
-
听起来像是 XY 问题。在这种情况下使用关键字,而不是位置。第三个参数很简单:只需使用
partial(f,z=4)并在调用时将 x、y 参数作为位置传递。 -
@Jean-FrançoisFabre,没有参数没有命名 - 查看示例中
f的定义,并且不能假设它们被命名,因为函数可能是预先存在的。将编辑 Q 以澄清。 -
@alancalvitti 你能澄清一下“未命名的论点”是什么意思吗?您是指没有参数名称、positional-only 参数或可变参数
*args样式参数的 C API 定义函数吗?除了这些特殊情况,Python 中所有常规定义的函数都可以使用关键字参数代替位置参数来调用。 -
@Brian,没有参数名称,就像上面示例中的
f。我认为它不适用于*arg样式参数,但它也应该适用于命名参数。 -
@alancalvitti 我看到三个参数名称,
x、y和z...
标签: python lambda decorator currying