Python部分用于忽略参数

时间:2015-10-03 11:53:54

标签: python lambda functools

是否有"对应物"在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信号和插槽。

1 个答案:

答案 0 :(得分: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),其中mapping是一个可迭代的int,它给你创建函数的参数的位置。

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