2010-01-01 9 views
6

Sto sviluppando un pacchetto Python usando un editor di testo e IPython. Ogni volta che cambio uno qualsiasi dei codici del modulo devo riavviare l'interprete per testarlo. Questo è un dolore poiché le classi che sto sviluppando si basano su un contesto che deve essere ristabilito su ogni ricarica.Come sviluppare un modulo/pacchetto Python senza dover riavviare l'interprete dopo ogni modifica?

sono consapevole della funzione reload(), ma questo sembra essere frowned upon (anche in quanto è stato relegato da un built-in in Python 3.0) e inoltre funziona raramente dal momento che i moduli hanno quasi sempre più riferimenti.

La mia domanda è: qual è il modo migliore/accettato per sviluppare un modulo/pacchetto Python in modo che non debba passare attraverso il dolore di ristabilire costantemente il mio contesto di interprete?

Un'idea a cui pensavo stava utilizzando il trucco if __name__ == '__main__': per eseguire direttamente un modulo in modo che il codice non venisse importato. Comunque questo lascia un po 'di cruft contestuale (specifico per il mio setup) nella parte inferiore dei miei file del modulo.

Idee?

risposta

2

ipython fa permettono ricarica vedono l'% corsa funzione di magia iPython doc

o se i moduli sotto quello hanno cambiato la funzione

dreloadd ricorsiva() Se si dispone di un contesto complesso è possibile crearlo in un altro modulo? o assegnarlo a una variabile globale che rimarrà in giro come l'interprete non viene riavviato

+0

L'utilizzo di% run da caricare da un modulo è geniale, grazie! – Brendan

+0

Anche il 'dreload()' sembra buono ma sembra che si imbattano in problemi con Numpy - sembra anche ignorare tutto ciò che ho impostato nell'elenco delle parole chiave 'exclude' ... – Brendan

+0

Il problema con Numpy e 'dreload()' è documentato qui https://bugs.launchpad.net/ipython/+bug/306805 – Brendan

0

è possibile creare uno script python che imposta il contesto ed eseguirlo 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 approccio diverso potrebbe essere di formalizzare lo sviluppo guidato da test e invece di usare l'interprete per testare il modulo, salvare i test ed eseguirli direttamente.

Probabilmente sai dei vari modi per farlo con python, immagino che il modo più semplice per iniziare in questa direzione sia copiare e incollare ciò che fai nell'interprete nella docstring come doctest e aggiungere quanto segue al parte inferiore del modulo:

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

Il test informale verrà quindi ripetuto ogni volta che il modulo viene chiamato direttamente. Questo ha un certo numero di altri benefici. Consulta lo doctest docs per ulteriori informazioni sulla scrittura di doctest.

+0

Il consiglio di guidare lo sviluppo usando i test * automatizzati * (con i moduli py.test o unittest, ad esempio) merita un +10, ma io posso dargli solo uno. :( –

+0

Anche questa è una buona idea, tuttavia l'API sta cambiando rapidamente al momento in questi primi stadi, cosa che in genere includo più avanti nello sviluppo dei pacchetti. – Brendan

1

Come utilizzare nose con nosey per eseguire automaticamente i test in un terminale separato ogni volta che si salvano le modifiche su disco? Imposta tutto lo stato di cui hai bisogno nei test di unità.

Problemi correlati