rendered paste bodyclass MatchFailure(Exception): passclass Matcher(object): def __init__(self, node): self.node = node self.child = None self.match = self.matchNormal self.compare = None def __or__(self, right): self.match = self.matchOr self.compare = right return self def __xor__(self, right): self.match = self.matchLongest self.compare = right return self def __and__(self, right): self.match = self.matchAnd self.compare = right return self def matchNormal(self, data): if not isinstance(data, self.node): raise MatchFailure if self.children == None: try: return data def __call__(self, child): if len(children) > 0: self.children = children else: self.children = None return selfdef MatchFunction(func): save = {} for name in func.func_code.co_names: if name in func.func_globals: save[name] = func.func_globals func.func_globals[name] = Matcher(eval(name)) tree = func() for name in func.func_code.co_names: if name in save: func.func_globals[name] = save[name] else: del func.func_globals[name] return tree.matchif __name__=='__main__': @MatchFunction def testMatcher(): # return tuple(list(dict) | list | dict) test = dict return tuple(test) test = (['Just a list'], {'foo' : 'bar'}, [{'Nested dict' : 'in list'}]) print testMatcher(test)