[pyar] Puedo evitar ejecución del bloque con un Context Manager?

Lucio Torre lucio.torre en gmail.com
Sab Jun 15 12:59:51 ART 2013


La unica negrada que encontre para hacer ejecucion condicional con context
managers es hacer esto:

with avoid_twice(name) as (a,b):
   do_stuff()

Entonces en el context manager haces lo siguiente:
en __exit__, atrapas las excepciones de que no puso asignar None a (a,b)
en __enter__, devolves None si ya se ejecuto el nombre, o (1,2) si no.

La logica es que cualquier excepcion que occura dentro de enter, aborta
todo y la levanta sin llamar a exit. Entonces, la unica manera de atrapar
una excepcion con exit es que ocurra despues de la ejecucion de __enter__
pero antes de la ejecucion del bloque.

Y lo unico que tenes ahi es la asignacion con el "as".

Obviamente que es horrible y no lo queres hacer, pero me parecio
interesante.

De paso, habria que probarlo, esto es teoria.

Lucio.


2013/6/15 <guagliap en tutopia.com>

> @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!
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20130615/8502400f/attachment-0001.html>


More information about the pyar mailing list