Example of a decorator that transform the first argument of a function to an array.
import types def first_arg_array(fn): def new(*args): if not (type(args[0]) == types.ListType): args = ([args[0]], ) + args[1:] return fn(*args) return new @first_arg_array def handle_args(devs, a): for dev in devs: print dev, a if __name__ == '__main__': handle_args('master', 'a') handle_args(['master', 'slave'], 'a')
master a master a slave a
def handle_an_exception_type(method): def new_method(instance, *args, **kws): try: return method(instance, *args, **kws) except ExceptionType: instance.print_errors() return None return new_method
class state_preserve: def __init__(self, test=True): self.test = test def __call__(self, op): def wrapped_op(instance, *args, **kws): try: instance._state_save(self.test) op(instance, *args, **kws) finally: instance._state_restore() return wrapped_op class Test: def _state_save(self, test=True): print '_state_save(%s)'%(test) def _state_restore(self): print '_state_restore' @state_preserve(False) def test_one(self): print 'test_one' @state_preserve() def test_two(self): print 'test_two' t = Test() t.test_one() t.test_two()
_state_save(False) test_one _state_restore _state_save(True) test_two _state_restore