Advertisement
Guest User

One more shot at Go-like defer() in Python

a guest
Jan 25th, 2014
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class deferrable(object):
  2.     def __init__(self, f):
  3.         self.f = f
  4.         self.deferred = None
  5.         self.dargs = None
  6.         self.dkwargs = None
  7.  
  8.     def register_defer(self, df, *args, **kwargs):
  9.         self.deferred = df
  10.         self.dargs = args
  11.         self.dkwargs = kwargs
  12.  
  13.     def __call__(self, *fargs, **fkwargs):
  14.         g = self.f.func_globals
  15.         g['defer'] = self.register_defer
  16.         self.f(*fargs, **fkwargs)
  17.         if self.deferred:
  18.             self.deferred(*self.dargs, **self.dkwargs)
  19.  
  20. @deferrable
  21. def do_stuff(thing1, thing2):
  22.     def exclaim(x):
  23.         print "!!!", x, "!!!"
  24.     defer(exclaim, 'done')
  25.     print "One thing:", thing1
  26.     print "And another:", thing2
  27.  
  28. if __name__ == '__main__':
  29.     do_stuff("foo", "bar")
  30.  
  31. """
  32. Should print:
  33. One thing: foo
  34. And another: bar
  35. !!! done !!!
  36.  
  37. Note that you need to do defer(function, arguments).
  38. Doing defer(function(arguments)) executes the function
  39. immediately. Not sure if this is preventable.
  40. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement