Stefan Stefan - 3 months ago 29
Python Question

Function chaining in python

On codewars.com I encountered the following task:


Create a function
add
that adds numbers together when called in succession. So
add(1)
should return
1
,
add(1)(2)
should return
1+2
, ...


While I'm familiar with the basics of Python, I've never encountered a function that is able to be called in such succession, i.e. a function
f(x)
that can be called as
f(x)(y)(z)...
. And thus far, I'm not even sure how to interpret this notation. As a mathematican, I'd suspect that
f(x)(y)
is a function that assigns to every
x
a function
g_{x}
and then returns
g_{x}(y)
and likewise for
f(x)(y)(z)
. Should this interpretation be correct, Python would allow me to dynamically create functions which seems very interesting to me. I've searched the web for the past hour, but wasn't able to find a lead in the right direction. Since I don't know how this programming concept is called, however, this may not be too surprising.

Therefore I'd like to ask you: How do you call this concept and where can I read more about it?

Jim Jim
Answer

One suggestion (the way I'd do this) would be with a custom int subclass that defines a __call__ which returns a new instance of itself with the updated value:

class CustomInt(int):
    def __call__(self, v):
        return CustomInt(self + v)

Function add can now be defined to return that CustomInt instance, which, as a callable, can be called in succession:

# as @Caridorc noted in a comment
# add could be simply written as: add = CustomInt 
>>> def add(v):
...    return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44)  # and so on..
50

In addition, as an int subclass, the returned value retains the __repr__ and __str__ behavior of ints.

Maybe this implementation suits you, alternatives likely exist and would be interesting to examine. I don't know whether this is function chaining as much as it's callable chaining, but, since functions are callables I guess there's no harm done.