Puedo evitar ejecución del bloque con un Context Manager?
guagliap en tutopia.com
guagliap en tutopia.com
Sab Jun 15 10:57:27 ART 2013
@Fisa:
¿y con algo como:
---
>>> class avoid_twice(object):
... tasks_done = []
...
... def __init__(self):
... pass
...
... def __enter__(self):
... return self
...
... def __exit__(self, exc_type, exc_val, exc_tb):
... pass
...
... def call(self, fx, *args):
... if fx in self.tasks_done:
... return
...
... self.tasks_done.append(fx)
... return fx(*args)
>>> def do_some_task_1(*args):
... print "task1 %s" % args
>>> def do_some_task_2(*args):
... print "task2 %s" % args
>>> with avoid_twice() as t:
... t.call(do_some_task_1, [1,2,3])
task1 [1, 2, 3]
>>> with avoid_twice() as t:
... t.call(do_some_task_1, [4,5])
>>> with avoid_twice() as t:
... t.call(do_some_task_2, [5,6])
task2 [5, 6]
---
te sirve? O sea, en vez de llamar directamente a las funciones
llamarlas vía el context manager que evalúa la precondición
y las ejecuta o no según la misma
Saludos,
Pablo
---
On Fri, 14 Jun 2013 17:40:15 -0300, fisa <fisadev en gmail.com> wrote:
>Busqué medio rápido y no vi que se pueda, así que pregunto por si
>alguno se le ocurre alguna manera.
>
>La idea: un context manager para usar en scripts de deploy (ej:
>fabric), que evite que se ejecute código que ya fue ejecutado alguna
>otra vez en el servidor.
>
>Ejemplo:
>
>with avoid_twice('create_postgres_cluster'):
> sudo('bla bla bla create cluster')
> sudo('bla bla more things')
>
>El comportamiento que quiero de avoid_twice sería el siguiente:
>* en el ingreso: busco nombre de acción ('create_postgres_cluster') en
>un archivo, si no está, sigue todo normal. Si ya está, *evito* que se
>ejecute el contenido del bloque
>* en la salida: guardo nombre de la acción en el archivo (así evitando
>futuras repeticiones)
>
>Por qué? me ahorra repetir esta lógica en muchos lados:
>
>if was_executed('x'):
> # code code code
> save_executed('x')
>
>(no me gusta tener que siempre recordar meter el save, y tener que
>siempre poner 2 veces el nombre de la acción)
>
>Todo es una pavada, salvo por el "Si ya está, *evito* que se ejecute
>el contenido del bloque". Alguna idea de cómo lograr eso
>específicamente?
>
>Saludos!
More information about the pyar
mailing list