Is there a "counterpart" in python for functools.partial
?
Namely what I want to avoid is writing:
lambda x, y: f(x)
But I would love to preserve the same attributes (keyword-args, nice repr) as I do when I write:
from functools import partial
incr = partial(sum, 1)
instead of
incr = lambda x: sum(1, x)
I know that something like this is very easy to write, but I am wondering if there is already a standard way of ignoring arguments.
One common usecase of this would be Qts Signals and Slots.
Just write a decorator that removes a certain number of arguments from the call:
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
my basic idea would be to make it more generic by default, e.g. having the signature:
remap_args(f, mapping)
where mapping is an iterable of ints which give you the position of the argument of the created function.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With