2009-10-14 23 views
5

Il PEP 8 consiglia di importare i moduli all'inizio dei programmi.Python: importazioni all'inizio del programma principale e PEP 8

Ora, ritengo che importare alcuni di essi all'inizio del programma principale (ad esempio, dopo if __name__ == '__main__') abbia senso. Ad esempio, se il programma principale legge gli argomenti dalla riga di comando, tendo a fare import sys all'inizio del programma principale: in questo modo, non è necessario importare sys quando il codice viene utilizzato come modulo, poiché non è necessario, in questo caso, per l'accesso agli argomenti della riga di comando.

Quanto è grave questa violazione a PEP 8? dovrei trattenermi dal fare questo? o sarebbe ragionevole modificare PEP 8?

+0

optparse è disponibile per l'analisi della riga di comando, meglio dell'utilizzo di sys.argv e dell'analisi personalizzata. – monkut

+1

Correlati: http://stackoverflow.com/questions/1024049/is-it-pythonic-to-import-inside-functions – codeape

+0

@monkut: optparse non è particolarmente utile se non usi la riga di comando * options * (es. , quando hai solo bisogno di gestire gli argomenti della riga di comando senza opzioni). – EOL

risposta

8

Non posso davvero dirti quanto sia male farlo.

Tuttavia, ho notevolmente migliorato le prestazioni (tempo di risposta, carico) per un'app Web importando determinate librerie solo al primo utilizzo.

BTW, il seguente è anche da PEP 8:

Ma ancora più importante: sapere quando essere incoerenti - a volte la guida allo stile semplicemente non si applica. Quando sei nel dubbio , usa il tuo miglior giudizio. Guarda in altri esempi e decidi che cosa sembra migliore. E non esitate a chiedere allo !

+2

Se sei davvero preoccupato di ciò, potresti voler dare un'occhiata a demandimport: http://hg.intevation.org/mercurial/crew/file/tip/mercurial/demandimport.py – tonfa

+1

Non vedo come aiuterebbe il tempo di risposta. Tempo di avvio di sicuro –

+0

@tonfa, wow grazie mille, non sapevo di quello – Prody

2

Ti consiglierei di fare ciò che ritieni più appropriato quando non c'è nulla in PEP sulla tua preoccupazione.

2

L'importazione di sys non richiede molto tempo che mi preoccuperei di ciò. Alcuni moduli richiedono più tempo tuttavia. Non penso che sys blocchino veramente lo spazio dei nomi. Non userei una variabile o una classe chiamata sys a prescindere.

Se pensi che faccia più male che bene averlo in cima, fallo comunque come preferisci. PEP 8 è solo una linea guida e un sacco di codice che vedi non è conforme ad esso.

6

In generale, non credo ci siano molti danni nell'importazione in ritardo per i moduli che potrebbero non essere necessari.

Tuttavia sys importerei in anticipo, in alto. È un modulo talmente comune che è probabile che tu possa usare sys altrove nel tuo script e non notare che non è sempre importato. sys è anche uno dei moduli che viene sempre caricato da Python stesso, quindi non si risparmia alcun tempo di avvio del modulo evitando l'importazione (non che ci sia comunque molto avvio per sys).

2

Il problema non sono le prestazioni.

Il problema è la chiarezza.

Il tuo programma "principale" è solo un programma principale oggi. Domani potrebbe essere una libreria inclusa in un programma principale di livello superiore. Più tardi, sarà solo un modulo in un pacchetto più grande.

Poiché la durata del programma "principale" potrebbe cambiare, si hanno due risposte.

  1. Isolare le cose "principali" all'interno di if __name__ == "__main__". Questa non è una violazione grottesca di PEP-8. Questo è un modo ragionevole per pacchettizzare le cose.

  2. Provare a limitare il numero di funzionalità negli script del programma "principale". Prova a tenerli a import s e al materiale if __name__ == "__main__". Se il tuo script principale è piccolo, la tua domanda di importazione sparirà.

Problemi correlati