class Pipeline(object): def __init__(self, _func_list=None): if _func_list is None: _func_list = [] self._func_list = _func_list def __call__(self, *args, **kwargs): f = None while f == None: try: f = self.pop(0) except IndexError: raise StopIteration() if callable(f): return f(self, *args, **kwargs) else: f = None def __iter__(self): for f in self._func_list: yield f def __eq__(self, other): return self._func_list == other._func_list def __add__(self, other): return Pipeline(self._func_list + list(other)) def push(self, f): return self._func_list.insert(0, f) def pop(self, *args, **kwargs): return self._func_list.pop(*args, **kwargs) def append(self, *args, **kwargs): return self._func_list.append(*args, **kwargs) if __name__ == '__main__': def add_1(pipeline, x): return pipeline(x + 1) def mul_2(pipeline, x): return pipeline(x * 2) def identity(pipeline, x): return x p = Pipeline([add_1, mul_2, add_1, mul_2, identity]) print p(1) # 10