Is there a chain calling method in Python?

You can use the reduce() functool — as Martijn briantly suggested, or you can write it yourself quite simply:

def chainCalling(arg, *funcs):
    if len(funcs) > 0:
        return chainCalling(funcs[0](arg), funcs[1:])
    return arg

or, as an alternative not using recursion — so not bound to the call stack limitation, as suggested by Martijn:

def chainCalling(arg, *funcs):
    result = arg
    for f in funcs:
        result = f(result)
    return result

Obviously, you'll want to call it that way, to avoid an useless reversal of the arguments:

chainCalling(arg, f1, f2, f3)

In case you want to apply the chain of functions to multiple arguments, you can create an aggregated function.

g = lambda x: f3(f2(f1(x)))

or more flexible (when there is an arbitrary list of functions):

from functools import reduce, partial

f3 = lambda x: -x
f2 = lambda x: x ** 2
f1 = lambda x: x + 1
function_list = (f1, f2, f3)
g = partial(reduce, lambda r, f: f(r), function_list)
print(g(3))  # results in -16

Use the reduce() function to chain calls:

from functools import reduce

val = reduce(lambda r, f: f(r), (f1, f2, f3), arg)

I used the forward-compatible functools.reduce() function; in Python 3 reduce() is no longer in the built-in namespace.

This can also be made a separate function, of course:

from functools import reduce

def chain(*funcs):
    def chained_call(arg):
        return reduce(lambda r, f: f(r), funcs, arg)

    return chained_call

Tags:

Python