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