如何为functoolpartial()指定arg位置

问题描述 投票:1回答:2

按照手册,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值的partialdecorator来将位置信息传递至dict的简便方法?例如传递xz位置,例如:

partial_dict(f,{0:4,2:6})(5)
python lambda decorator currying
2个回答
1
投票
>>> 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提供参数的语义与您需要将参数存储在以上argskwargs变量中的语义相同,以便对f的最终调用是明智的。有关更多信息,请查看functools.partial

中给出的functools module documentation的pseduo实现。

0
投票
要实现问题中概述的所需行为,您必须像这样提供自己的包装函数:

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))
© www.soinside.com 2019 - 2024. All rights reserved.