def PipeLine ( *args , **kwargs ) :

"""

Given an arbitrary number of functions we create a pipeline where the output

is piped between functions. you can also specify a tuple of arguments that

should be passed to functions in the pipeline. The first arg is always the

output of the previous function.

"""

def wrapper ( *data ) :

if len ( args ) == 1 :

if args [ - 1 ] .__name__ in kwargs:

otherArgs = data + kwargs [ args [ - 1 ] .__name__ ]

return args [ - 1 ] ( *otherArgs )

else :

return args [ - 1 ] ( *data )

else :

if args [ - 1 ] .__name__ in kwargs:

otherArgs = kwargs [ args [ - 1 ] .__name__ ]

del kwargs [ args [ - 1 ] .__name__ ]

return args [ - 1 ] ( PipeLine ( *args [ :- 1 ] , **kwargs ) ( *data ) , *otherArgs )

else :

return args [ - 1 ] ( PipeLine ( *args [ :- 1 ] , **kwargs ) ( *data ) )

return wrapper

def testPipelineWithArgs ( ) :

"""

Test all the major functionality:

multiple functions, initial arguments

per function arguments stored in kwargs

"""

def add1 ( input_ ) :

return input_ + 1

def subX ( input_ , x ) :

return input_ - x

def stringify ( input_ ) :

return str ( input_ )

pipeline = PipeLine (

add1 ,

subX ,

stringify ,

subX = ( 2 , ) ,

)