This is a simple recipe which uses generators to execute a chain of functions. These functions and their argurments are internally present in a list.Here use of generators and properties defined on the result set gives more control to users.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#!/usr/bin/env python class chainfunc(list): def __init__(self): self.res =  def append(self, func, *args, **kw): super(self.__class__, self).append([func,args,kw]) def __call__(self): for (fn, args, kw) in self: retval = (fn.__name__, fn(*args, **kw)) self.res.append(retval) yield retval def ANDoperation(self): state = reduce(lambda x,y: x and y, [bool for id,bool in self.res]) return state and_operation = property(fget=ANDoperation) def ORoperation(self): state = reduce(lambda x,y: x or y, [bool for id,bool in self.res]) return state or_operation = property(fget=ORoperation) # some sample functions def t1(name,i): print name print i return True def t2(id,i=False): print id print i return i if __name__ == '__main__': cf = chainfunc() cf.append(t1,'hello',2) cf.append(t2,'ab_1',False) cf.append(t2,'ab_2',True) gen = cf() # execute all functions for i in range(len(cf)): print "Function name= %s, function State=%s, "%gen.next() print "AND operation =%s, OR operation=%s\n"%(cf.and_operation, cf.or_operation)
In the example taken here, there is a group of functions each returning a boolean value. We require different operations to be performed on these functions a) an AND operation of all those return values b) an OR operation of all those return values and results of these define our system. Since the current results of all these functions and their names can be saved in a list, based on manipulation of this result list, various properties can be defined which tell the current status of the system as these functions are executed.