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

Jesús Gómez jgomo3 en gmail.com
Vie Jun 14 18:12:50 ART 2013


No respondo a tu pregunta pero ...

El 14 de junio de 2013 16:10, fisa <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')
>
>
Si ya te estás tomando la molestia de ponerle un nombre al bloque
(create_postgres_cluster), tal vez sea más elegante crear funciones, en
este caso "create_postgres_cluster" y usar algún wrap:

    avoid_twice(create_postgres_cluster)
    avoid_twice(create_tal_otra_cosa)
    avoid_twice(preparar_lo_otro)

Y entonces implementas esa lógica en la función avoid_twice, preguntando
por el nombre de la función con :__name__ y manteniendo una lista:

    def avoid_twice(f):
        if f.__name__ not in register:
            register.append(f.__name__)
            f()

Claro, eso de la elegancia es a gusto personal, pero mi justificación es
que te quedan las llamadas a los bloques de trabajo repetible en tres
líneas, en vez de tres llamadas a with con bloques de diferente tamaño. Al
final, visualmente vez una simple lista de tres tareas que deben hacerse
sin repetirlas cada una.



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
> 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/20130614/504289cd/attachment.html>


More information about the pyar mailing list