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

hernantz hernantz en gmail.com
Sab Jun 15 00:08:54 ART 2013


On Fri 14 Jun 2013 11:29:13 PM ART, fisa wrote:
>
> On Jun 14, 2013 10:10 PM, "hernantz" <hernantz en gmail.com
> <mailto:hernantz en gmail.com>> wrote:
> >
> > On Fri 14 Jun 2013 06:47:21 PM ART, QliX=D! [aka EHB] wrote:
> >>
> >> Workflow bssed programming? Hay un par de frameworks orientados a la
> >> tarea de ar mm ar un flujo de trabajo que sea retomable en multiples
> >> puntos del mismo. Busco los pinks cuando llego a casa y te lo paso.
> >>
> >> El jun 14, 2013 5:40 PM, "fisa" <fisadev en gmail.com
> <mailto:fisadev en gmail.com>
> >> <mailto:fisadev en gmail.com <mailto:fisadev en gmail.com>>> escribió:
> >>
> >>
> >>     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!
> >>
> >>     --
> >>     fisa  -  Juan Pedro Fisanotti
> >>     _______________________________________________
> >>     pyar mailing list pyar en python.org.ar
> <mailto:pyar en python.org.ar> <mailto:pyar en python.org.ar
> <mailto: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
> >>
> >>
> >>
> >> _______________________________________________
> >> pyar mailing list pyar en python.org.ar <mailto: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
> >
> >
> > done = []
> >
> > def not_done(key):
> >  if key not in done:
> >    done.add(key)
> >    return True
> >
> > if not_done('setup_database'):
> >    setup_database()
> >
> > if not_done('setup_database'):
> >    setup_database()  # este ya no corre
> >
>
> Pero el tema de eso es que marca la acción como ya hecha antes de
> hacerla, cosa que no está bien para un script de deploy, jeje.
>
> Justamente mi necesidad viene de casos donde una acción falla, arreglo
> algo, y vuelvo a correr el script, pero quiero que no haga de vuelta
> cosas que una vez hechas no se pueden repetir (ej: crear el cluster de
> postgres).
>
>
>
> _______________________________________________
> 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

aah, esta bien.
No se como se hace usando context managers (mas concretamente, como 
salirse del context si se cumple una condición, sin tener que escribir 
un if en cada bloque).
Se pueden reconsiderar los decoradores? :D

def once(fn):
   def inner(*args, **kwargs):
       if fn.__name__ not in registro:
         try:
           fn(*args, **kwargs)
           registro.append(fn.__name__)
         except:
           pass
   return inner

o algo asi... ahi se estaria marcando la accion como hecha si todo 
salio bien...


More information about the pyar mailing list