6

我想使用 functools 中的 partial 来部分应用函数的第二个参数,我知道使用 lambda 而不是 partial 很容易,如下所示

>>> def func1(a,b):
...     return a/b
...
>>> func2 = lambda x:func1(x,2)
>>> func2(4)
2

但我严格想在这里使用部分(为了学习)所以我想出了这个。

>>> def swap_binary_args(func):
...     return lambda x,y: func(y,x)
...
>>> func3 = partial(swap_binary_args(func1),2)
>>> func3(4)
2

是否可以将此策略扩展到可以在任何地方部分应用任何参数的级别,例如以下伪代码

>>>def indexed_partial(func, list_of_index, *args):
...     ###do_something###
...     return partially_applied_function

>>>func5=indexed_partial(func1, [1,4,3,5], 2,4,5,6)

在我们的例子中,我可以使用这个函数如下

>>>func6=indexed_partial(func1, [1], 2)

是否有可能像我想要的那样有一个索引部分?有什么类似的东西我不知道吗?更重要的是,索引部分的想法通常是一个好主意还是坏主意,为什么?

此问题已被标记为可能重复Can one partial apply the second argument of a function that takes no keyword arguments? 在那个问题中,OP询问是否可以部分应用第二个参数,但在这里我要问的是如何烹饪一个可以部分应用任何任意参数的函数

4

1 回答 1

1

我也认为你问的问题不能(很容易?)用functools.partial. 可能最好的(也是最易读的)解决方案是使用partial关键字参数。但是,如果您想使用位置参数(以及因此索引的部分参数),这里是一个可能的定义indexed_partial

def indexed_partial(func, list_of_index, *args):
    def partially_applied_function(*fargs, **fkwargs):
        nargs = len(args) + len(fargs)
        iargs = iter(args)
        ifargs = iter(fargs)
        posargs = ((ifargs, iargs)[i in list_of_index].next() for i in range(nargs))
        return func(*posargs, **fkwargs)
    return partially_applied_function
于 2015-04-11T21:40:54.373 回答