def check24DecoratorMode(self): log = [] def track(f,k,v,d): log.append((f,k,v)) return v def foo(x): pass add_assignment_advisor(track,1)(foo) x = 1 self.assertEqual(log, [(sys._getframe(),'foo',foo)])
def checkAssignAdvice(self): log = [] def track(f,k,v,d): log.append((f,k,v)) if k in f.f_locals: del f.f_locals[k] # simulate old-style advisor add_assignment_advisor(track,frame=sys._getframe()) test_var = 1 self.assertEqual(log, [(sys._getframe(),'test_var',1)]) log = [] add_assignment_advisor(track,1) test2 = 42 self.assertEqual(log, [(sys._getframe(),'test2',42)]) # Try doing double duty, redefining an existing variable... log = [] add_assignment_advisor(track,1) add_assignment_advisor(track,1) test2 = 42 self.assertEqual(log, [(sys._getframe(),'test2',42)]*2)
def as_(*decorators): """Use Python 2.4 decorators w/Python 2.2+ Example:: import dispatch class Foo(object): [dispatch.as(classmethod)] def something(cls,etc): \"""This is a classmethod\""" """ if len(decorators)>1: decorators = list(decorators) decorators.reverse() def callback(frame,k,v,old_locals): for d in decorators: v = d(v) return v from protocols.advice import add_assignment_advisor return add_assignment_advisor(callback)