Decorators

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

method decorator

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

method decorator receiving an argument

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

python/decorators.txt · Last modified: 2010/08/10 (external edit)
CC Attribution-Noncommercial-Share Alike 3.0 Unported
Valid CSS Driven by DokuWiki Recent changes RSS feed Valid XHTML 1.0