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:
Publicar un comentario