Decorando decoradores
Este post fue migrado de un blog hecho con Wordpress. Si se ve mal, dejame un comentario y lo arreglo.
Una de las preguntas que aveces me hacen luego de hablar sobre Taint Mode es: una vez que la aplicación pasa de desarrollo a producción, ¿hay alguna forma de deshabilitar los decoradores?
La biblioteca usa decoradores para marcar entradas no confiables, sumideros sensibles y funciones limpiadoras con la idea de encontrar posibles vulnerabilidades en tiempo de desarrollo. Si en producción no los requerimos más, esos decoradores producen overhead.
Entonces... qué se puede hacer? Editar el código comentando los decoradores no escala[0]. Una alternativa es utilizar un nuevo decorador: llamemoslo @apply_decorator y vamos a utilizarlo para controlar mediante alguna condición (por ejemplo una variable en el archivo de configuración) si se debe usar o no el decorador.
COND = True
def apply_decorator(d):
if COND: return d else: return lambda f: f
Si la condición es verdadera, se retorna el decorador original, sino una función fake (implementada utilizando lambda
) que recibe una función y retorna la misma función: un decorador que no hace nada.
Un ejemplo de su uso en el REPL de Python:
>>> @apply_decorator ... def mydeco(f): ... def inner(*a, **kw): ... print "decorado" ... return f(*a, **kw) ... return inner ... >>> mydeco>>> COND = False >>> @apply_decorator ... def mydeco(f): ... def inner(*a, **kw): ... print "decorado" ... return f(*a, **kw) ... return inner ... >>> mydeco at 0xb7753dbc>
Podemos aplicarlo directamente a la definición de nuestros decoradores
@apply_decorator def mi_decorador(f): ...
o al principio de nuestro programa.
mi_decorador = apply_decorator(mi_decorador)
[0] nessita trademark.
Comentarios
Comments powered by Disqus