sábado, 20 de septiembre de 2008

Decoradores en python

Para entender fácilmente los que son los decoradores en python podemos pensar que son una especie de filtros que se ejecutan antes de la llamada a una función.

Realmente un decorador se ejecuta antes de la función decorada (realizando cualquier tipo de acción) y devuelve la función a ejecutar (posiblemente la función decorada). Es más fácil de entender con un ejemplo.

#!/usr/bin/python

def filtro(f):
def permiso_denegado(*args):
print '%s no tiene permisos para realizar esa accion' % args[0]

def comprobacion(*args):
if args[0] == 'admin':
return f(*args)
else:
return permiso_denegado(*args)

return comprobacion


@filtro
def accion(usuario):
print 'Accion realizada por %s' % usuario

accion('guest')

En este caso se intenta realizar una acción pero si el usuario pasado como parámetro no es 'admin' no puede realizarla, en lugar de devolver una referencia a la función original, se devuelve la función de permiso denegado, filtro es el decorador.

También existe la posibilidad de combinar decoradores, lo importante es tener en cuenta cuando se programa un decorador que no tiene porqué ser el único (cuidado lo que se hace con los parámetros) y el orden, en el ejemplo debug(filtro(debug(accion))).

#!/usr/bin/python

_MODO_DEBUG = True

def debug(f):
if _MODO_DEBUG:
print 'Se ejecuta la funcion: %s' % f.__name__
return f

def filtro(f):
def permiso_denegado(*args):
print '%s no tiene permisos para realizar esa accion' % args[0]

def comprobacion(*args):
if args[0] == 'admin':
return f(*args)
else:
return permiso_denegado(*args)

return comprobacion

@debug
@filtro
@debug
def accion(usuario):
print 'Accion realizada por %s' % usuario

accion('guest')

0 comentarios: