按照手册,functools
partial()
“用于部分函数应用程序,它“冻结”函数的参数和/或关键字的某些部分,从而产生具有简化签名的新对象。”
指定一个人希望评估的参数位置的最佳方法是什么?
编辑
请注意,要部分评估的函数可能包含命名和未命名的参数(这些函数应该完全是任意的,并且可能已经存在)
END EDIT
例如,考虑:
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
怎么办?
是否有使用键为所需arg位置且各自值为arg值的partial
或decorator
来将位置信息传递至dict
的简便方法?例如传递x
和z
位置,例如:
partial_dict(f,{0:4,2:6})(5)
>>> g = partial(f, z=10)
>>> g(2, 4)
40
>>> h = partial(f, y=4, z=10)
>>> h(2)
40
请注意,一旦对给定参数使用关键字参数,就
必须对所有其余参数使用关键字参数。例如,以下内容无效:但是继续使用关键字参数是:
>>> j = partial(f, x=2, z=10) >>> j(4) TypeError: f() got multiple values for argument 'x'
>>> j = partial(f, x=2, z=10)
>>> j(y=4)
40
使用functools.partial
时,存储*args
和**kwargs
的值以供以后插值。当您以后调用“部分应用”函数时,functools.partial
的实现将前面提供的*args
和**kwargs
有效地分别添加到了前端和后端的参数列表中,就好像您插入了这些参数解压缩一样你自己即致电
h = partial(1, z=10)
f(4)
大致相当于写作
args = [1]
kwargs = {'z': 10}
f(*args, 4, **kwargs)
因此,向functools.partial
提供参数的语义与您需要将参数存储在以上args
和kwargs
变量中的语义相同,以便对f
的最终调用是明智的。有关更多信息,请查看functools.partial
functools
module documentation的pseduo实现。partial
这样:
def partial_positionals(func, positionals):
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))), **kwargs)
return wrapper
输出:
def f(x, y, z):
return x + 2 * y + 3 * z
print(partial_positionals(f, {0: 4, 2: 6})(5))