Search code examples
pythonfunctional-programmingclojure

Clojure style function "threading" in Python


Clojure has a "->" macro which inserts each expression recursively as the first argument of the next expression.

This means that I could write:

(-> arg f1 f2 f3)

and it behaves like (shell piping):

f3(f2(f1(arg)))

I would like to do this in Python; however, searching seems to be a nightmare! I couldn't search for "->", and neither could I search for Python function threading!

Is there a way to overload, say, the | operator so that I could write this in Python?

arg | f1 | f2 | f3

Thanks!


Solution

  • You can easily implement something like this yourself.

    def compose(current_value, *args):
        for func in args:
            current_value = func(current_value)
        return current_value
    
    def double(n):
        return 2*n
    
    print compose(5, double, double) # prints 20