2011-03-10 14 views
33

Ho creato un modulo chiamato util che fornisce classi e funzioni che uso spesso in Python. Alcuni hanno bisogno di funzionalità importate. Quali sono i pro ei contro dell'importazione delle cose necessarie all'interno della definizione di classe/funzione? È meglio di import all'inizio di un file di modulo? È una buona idea?Istruzione di importazione all'interno della definizione di classe/funzione - è una buona idea?

+1

possibile duplicato di [Buona o cattiva pratica in Python: import nel bel mezzo di un file] (http://stackoverflow.com/questions/1188640/good-or-bad-practice-in- python-import-in-the-middle-of-a-file) –

risposta

37

E 'lo stile più comune per mettere ogni importazione nella parte superiore del file. PEP 8 lo consiglia, che è una buona ragione per farlo. Ma non è un capriccio, ha dei vantaggi (anche se non abbastanza critici da rendere tutto il resto un crimine). Permette di trovare tutte le importazioni a colpo d'occhio, invece di guardare attraverso l'intero file. Garantisce inoltre che tutto venga importato prima che venga eseguito qualsiasi altro codice (che può dipendere da alcune importazioni). NameError di solito sono facili da risolvere, ma possono essere fastidiosi.

Non c'è alcun inquinamento (significativo) nello spazio dei nomi da evitare mantenendo il modulo in un ambito più piccolo, poiché tutto ciò che si aggiunge è il modulo reale (no, import * doesn't count and probably shouldn't be used anyway). All'interno delle funzioni, si importerebbe di nuovo su ogni chiamata (non molto dannosa poiché tutto viene importato una volta, ma non richiesto).

+0

Ho cambiato la mia scelta in questa risposta. L'ho analizzato ed è il migliore finora. –

+0

Penso che l'argomento migliore per questo è: Se si importa il file, si desidera verificare all'importazione se si dispone di tutti i pacchetti giusti, non al punto in cui si utilizzerà una determinata funzione. Certo, potrebbe essere che non hai bisogno di tutti i pacchetti (immagino che questo sia il rovescio della medaglia) –

2

Credo che sia la migliore pratica (secondo alcuni PEP) che si mantengano le istruzioni di importazione all'inizio di un modulo. È possibile aggiungere istruzioni di importazione a un file __init__.py, che importerà tali moduli a tutti i moduli all'interno del pacchetto.

Quindi ... è sicuramente qualcosa che puoi fare nel modo in cui lo stai facendo, ma è scoraggiato e in realtà non necessario.

12

PEP8, la guida di stile Python, afferma che:

Le importazioni sono sempre messo in cima file, subito dopo qualsiasi modulo commenti e docstrings, e prima di variabili globali del modulo e costanti.

Ovviamente questa non è una regola difficile e veloce e le importazioni possono andare ovunque si desideri. Ma metterli in cima è il modo migliore per farlo. Ovviamente puoi importare all'interno di funzioni o classi.

ma nota non si può fare questo:

def foo(): 
    from os import * 

Perché:

SyntaxWarning: import * only allowed at module level 
+0

Quando inserisco le istruzioni di importazione all'inizio del modulo, e poi uso questo modulo in un file diverso e chiamo 'dir (util)' in esso, io vedi non solo i nomi di funzioni/classi che ho definito all'interno di 'util.py', ma anche' importazioni' che sono fatte lì. È buono? –

+0

Sì, poiché 'import' esegue tutte le istruzioni nel file sorgente caricato. Quindi supponiamo che esista un modulo 'X' che importa' Y'. Ora quando importiamo 'X' in un altro modulo, viene importato anche' Y'. – user225312

+0

Ho pensato che viola l'incapsulamento perché chiunque ha accesso all'implementazione (ottiene informazioni sui moduli che ho usato). –

2

Mentre le altre risposte hanno quasi ragione, c'è un motivo per cui Python consente questo.

Non è intelligente l'importazione di materiale ridondante che non è necessario. Quindi, se vuoi, ad es. analizzare XML in un albero di elementi, ma non si vuole usare il parser XML lento incorporato se lxml è disponibile, è necessario controllarlo nel momento in cui è necessario richiamare il parser.

E invece di memorizzare la disponibilità di lxml all'inizio, io preferirei try l'importazione e l'utilizzo di lxml, except non è lì, nel qual caso mi piacerebbe ripiego al modulo integrato xml.

1

Come la risposta della pecora volante, sono d'accordo sul fatto che gli altri abbiano ragione, ma metto le importazioni in altri posti come nelle routine __init__() e chiamate di funzione quando sto sviluppando il codice. Dopo che la mia classe o funzione è stata testata e collaudata per funzionare con l'importazione al suo interno, di solito fornisco il suo modulo con l'importazione seguendo le linee guida PEP8. Lo faccio perché a volte mi dimentico di eliminare le importazioni dopo aver rifatto il codice o rimosso il vecchio codice con idee sbagliate. Mantenendo le importazioni all'interno della classe o della funzione in fase di sviluppo, specificherò le sue dipendenze se voglio copiarlo altrove o promuoverlo nel proprio modulo ...

0

Spostare solo le importazioni in un ambito locale, ad esempio all'interno di una definizione della funzione, se è necessario risolvere un problema come evitare un'importazione circolare o provare a ridurre il tempo di inizializzazione di un modulo. Questa tecnica è particolarmente utile se molte delle importazioni non sono necessarie a seconda di come viene eseguito il programma. È anche possibile spostare le importazioni in una funzione se i moduli vengono utilizzati sempre solo in quella funzione. Si noti che il caricamento di un modulo per la prima volta può essere costoso a causa della prima inizializzazione del modulo, ma il caricamento di un modulo più volte è praticamente gratuito, con un costo solo di un paio di ricerche nel dizionario. Anche se il nome del modulo è andato fuori ambito, il modulo è probabilmente disponibile in sys.modules.

https://docs.python.org/3/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module

Problemi correlati