Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import print_function
- class deferrable(object):
- def __init__(self, f):
- self.f = f
- self.deferred = None
- self.dargs = None
- self.dkwargs = None
- def register_defer(self, df, *args, **kwargs):
- self.deferred = df
- self.dargs = args
- self.dkwargs = kwargs
- def __call__(self, *fargs, **fkwargs):
- if hasattr(self.f, "func_globals"):
- g = self.f.func_globals
- elif hasattr(self.f, "__globals__"):
- g = self.f.__globals__
- else:
- raise NotImplementedError("What version of Python is this?")
- g['defer'] = self.register_defer
- self.f(*fargs, **fkwargs)
- if self.deferred:
- self.deferred(*self.dargs, **self.dkwargs)
- class mock_file(object):
- def close(self):
- print("I'm closed.")
- @deferrable
- def do_stuff(thing1, thing2):
- f = mock_file()
- defer(f.close)
- print("One thing:", thing1)
- print("And another:", thing2)
- @deferrable
- def do_other_stuff(thing1, thing2):
- def exclaim(x):
- print('!!!', x, '!!!')
- defer(exclaim, 'done')
- print("One more thing:", thing1)
- print("And not-quite finally:", thing2)
- if __name__ == '__main__':
- do_stuff("foo", "bar")
- do_other_stuff("foo", "bar")
- """
- Should print:
- One thing: foo
- And another: bar
- I'm closed.
- One more thing: foo
- And not-quite finally: bar
- !!! done !!!
- Note that you need to do defer(function, arguments).
- Doing defer(function(arguments)) executes the function
- immediately. Not sure if this is preventable.
- """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement