Le altre risposte mostrano una lieve confusione su come funziona davvero import
.
Questa dichiarazione:
import foo
equivale all'incirca a questa dichiarazione:
foo = __import__('foo', globals(), locals(), [], -1)
cioè, crea una variabile nell'ambito corrente omonimo del modulo richiesto, e cessionari è il risultato della chiamata di __import__()
con il nome di quel modulo e un carico di argomenti predefinito.
La funzione __import__()
gestisce concettualmente una stringa ('foo'
) in un oggetto modulo. I moduli sono memorizzati nella cache sys.modules
, e questo è il primo aspetto __import__()
- se sys.modules ha una voce per 'foo'
, questo è ciò che restituirà __import__('foo')
, qualunque esso sia. Davvero non interessa il tipo.Puoi vederlo in azione tu stesso; provare a eseguire il seguente codice:
import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop
Lasciando da parte le preoccupazioni stilistiche, per il momento, avere un'istruzione import all'interno di una funzione funziona come si vorrebbe. Se il modulo non è mai stato importato prima, viene importato e memorizzato nella cache in sys.modules. Quindi assegna il modulo alla variabile locale con quel nome. Lo standard non non è modificare qualsiasi stato a livello di modulo. È eventualmente modificare alcuni stato globale (aggiungendo una nuova voce a sys.modules).
Detto questo, non utilizzo quasi mai import
all'interno di una funzione. Se l'importazione del modulo crea un rallentamento notevole nel tuo programma, come se eseguisse un lungo calcolo nella sua inizializzazione statica, o semplicemente un enorme modulo, e il tuo programma raramente ha effettivamente bisogno del modulo per qualsiasi cosa, è perfettamente bene avere l'importazione solo all'interno le funzioni in cui è usato. (Se questo è stato spiacevole, Guido saltava nella sua macchina del tempo e cambiava Python per impedirci di farlo.) Ma di regola io e la comunità Python generale mettevamo tutte le nostre istruzioni di importazione nella parte superiore del modulo nell'ambito del modulo.
fonte
2009-11-11 16:31:37
sarebbe davvero bello avere un "con (importare StringIO) come moduleName: syntax – JeremyKun
@Bean: se è così che non devi digitare un nome di modulo lungo o scomodo, allora c'è un modo semplice:' importare StringIO' e poi 'sio = StringIO'. Ora puoi fare' file_handle = sio.StringIO ('ciao mondo') 'e salvare quei preziosi cinque caratteri. Lo userei con parsimonia, però, perché può rendere il codice più difficile leggere (l'assegnazione è facile da perdere, i nomi dei moduli non standard possono distrarre.) – cvoinescu