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?
risposta
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).
Ho cambiato la mia scelta in questa risposta. L'ho analizzato ed è il migliore finora. –
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) –
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.
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
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? –
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
Ho pensato che viola l'incapsulamento perché chiunque ha accesso all'implementazione (ottiene informazioni sui moduli che ho usato). –
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
.
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 ...
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.
- 1. Quando l'eredità virtuale è una buona idea?
- 2. È anche una buona idea usare OData?
- 3. RubyGems tramite MacPorts è una buona idea?
- 4. La dichiarazione parallela di funzione è una buona idea?
- 5. Oggetti di lunghezza variabile: una buona idea?
- 6. Campi multivalore una buona idea?
- 7. È una buona idea catturare AssertionError nei test di JUnit?
- 8. È una buona idea imparare JavaScript prima di imparare jQuery?
- 9. Internazionalizzazione con pennini. È davvero una buona idea?
- 10. Valori restituiti standardizzati - è una buona o una cattiva idea
- 11. È una buona idea hash una classe Python?
- 12. È una buona idea restituire "const char *" da una funzione?
- 13. È buona norma nascondere la definizione della struttura in C?
- 14. È una buona idea utilizzare Database Mail come server di ritrasmissione della posta elettronica?
- 15. La definizione di una funzione interna all'interno di una funzione ricorsiva è una cattiva idea?
- 16. REST Web Services che utilizzano MVC, è una buona idea?
- 17. Sta chiamando - [NSRunLoop runUntilDate:] una buona idea?
- 18. Perché il valore di una classe di valori come hashCode "non è una buona idea"?
- 19. La registrazione a un messaggio è una buona idea?
- 20. Perché MD5'ing a UUID non è una buona idea?
- 21. Perché evitare l'istanziazione booleana è una buona idea?
- 22. Scrivere un demone in Python è una buona idea?
- 23. Data Access Layer come servizio Web - È una buona idea?
- 24. Può un minificatore fare questo? (.... ed è una buona idea?)
- 25. È una buona idea usare MySQL e Neo4j insieme?
- 26. C# È action.BeginInvoke (action.EndInvoke, null) una buona idea?
- 27. Una buona comunicazione tra le applicazioni locali è una buona idea?
- 28. È una buona idea usare una colonna calcolata come parte di una chiave primaria?
- 29. È possibile ottenere una definizione della classe di case Scala da una definizione di schema Avro?
- 30. importazione Theano ottiene istruzione illegale
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) –