2010-01-01 11 views
6

Estoy desarrollando un paquete de Python usando un editor de texto e IPython. Cada vez que cambio alguno de los códigos del módulo, tengo que reiniciar el intérprete para probarlo. Esto es un dolor ya que las clases que desarrollo se basan en un contexto que debe restablecerse en cada recarga.¿Cómo desarrollar un módulo/paquete de Python sin tener que reiniciar el intérprete después de cada cambio?

Soy consciente de la función reload(), pero esto parece ser frowned upon (también ya que se ha relegado de un built-in en Python 3.0) y, además, rara vez funciona ya que los módulos casi siempre tienen múltiples referencias.

Mi pregunta es: ¿cuál es la mejor/aceptada forma de desarrollar un módulo/paquete de Python para que no tenga que pasar por el dolor de restablecer constantemente mi contexto de intérprete?

Una idea en la que pensé fue utilizar el truco if __name__ == '__main__': para ejecutar un módulo directamente, por lo que el código no se importa. Sin embargo, esto deja un montón de elementos contextuales (específicos de mi configuración) en la parte inferior de los archivos de mi módulo.

Ideas?

Respuesta

2

IPython sí permite recargas ver el% de ejecución función mágica iPython doc

o si los módulos bajo el mismo han cambiado la función dreloadd recursiva()

Si usted tiene un complejo contexto es posible crear en otro módulo? o asignar a una variable global que se mantendrá en torno a que el intérprete no se reinicia

+0

Usar% run para cargar desde un módulo es brillante, ¡gracias! – Brendan

+0

El 'dreload()' también suena bien, pero parece que tiene problemas con Numpy; también parece ignorar todo lo que establecí en la lista de palabras clave 'exclude' ... – Brendan

+0

El problema con Numpy y' dreload() 'es documentado aquí https://bugs.launchpad.net/ipython/+bug/306805 – Brendan

0

podría crear un script en Python que configura su contexto y ejecutarlo con

python -i context-setup.py 


    -i  When a script is passed as first argument or the -c option is 
      used, enter interactive mode after executing the script or the 
      command. It does not read the $PYTHONSTARTUP file. This can be 
      useful to inspect global variables or a stack trace when a 
      script raises an exception. 
3

Un enfoque diferente puede ser de formalizar su desarrollo impulsado por la prueba, y en lugar de utilizar el intérprete para probar su módulo, guarde las pruebas y ejecútelas directamente.

Probablemente conozca las diversas formas de hacer esto con python, imagino que la forma más sencilla de comenzar en esta dirección es copiar y pegar lo que hace en el intérprete en la carpeta de documentos como doctest y agregar lo siguiente al parte inferior de su módulo:

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

Su prueba informal se repetirá cada vez que se llame directamente al módulo. Esto tiene una serie de otros beneficios. Consulte el doctest docs para obtener más información sobre cómo escribir doctests.

+0

El consejo para impulsar el desarrollo usando pruebas * automatizadas * (con los módulos py.test o unittest, por ejemplo) merece un +10, pero puede darle solo uno. :( –

+0

También es una buena idea. Sin embargo, la API está cambiando rápidamente en este momento en estas primeras etapas. Esto es algo que generalmente incluiría más adelante en el desarrollo de paquetes. – Brendan

1

¿Qué le parece usar nose con nosey para ejecutar sus pruebas automáticamente en un terminal diferente cada vez que guarda sus ediciones en el disco? Configure todo el estado que necesita en las pruebas de su unidad.

Cuestiones relacionadas