6

python中是否有“对应物” functools.partial

即我要避免的是写:

lambda x, y: f(x)

但我很想保留与编写时相同的属性(keyword-args、nice repr):

from functools import partial
incr = partial(sum, 1)

代替

incr = lambda x: sum(1, x)

我知道这样的东西很容易写,但我想知道是否已经有一种忽略参数的标准方法。

一个常见的用例是 Qts Signals and Slots。

4

1 回答 1

1

只需编写一个装饰器,从调用中删除一定数量的参数:

def ignoreargs(func, count):
    @functools.wraps(func)
    def newfunc(*args, **kwargs):
        return func(*(args[count:]), **kwargs)
    return newfunc
>>> def test(a, b):
        print(a, b)
>>> test3 = ignoreargs(test, 3)
>>> test3(1, 2, 3, 4, 5)
4 5

我的基本想法是在默认情况下使其更通用,例如具有签名:remap_args(f, mapping)其中映射是整数的可迭代,它为您提供创建函数的参数的位置。

def remap_args(func, mapping):
    @functools.wraps(func)
    def newfunc(*args, **kwargs):
        newargs = [args[m] for m in mapping]
        return func(*newargs, **kwargs)
    return newfunc
>>> t = remap_args(test, [5, 2])
>>> t(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
5 2
于 2015-10-03T12:07:17.023 回答