[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