2012-09-25 5 views
6

C'è qualche differenza, sottile o non così sottile, tra gli effetti delle seguenti istruzioni di importazione? Ho trovato entrambi utilizzati nei programmi di esempio e abbastanza sicuro, entrambi sembrano funzionare. Andrebbe contro il rigore di Python "c'è un solo modo di fare cose" se fossero totalmente equivalenti in funzione, quindi sono perplesso. Sto appena iniziando in Python e sto cercando di mantenere buone abitudini. Così, per esempio, per il modulo interpolate nel pacchetto SciPy ...Modo Pythonic per importare moduli da pacchetti

from scipy import interpolate as spi 

o

import scipy.interpolate as spi 

Entrambi sembrano mettere il modulo interpolate nello spazio dei nomi corrente come spi

risposta

0

È una questione di gusti, davvero.

In questo caso particolare, vorrei utilizzare import scipy.interpolate as spi, per ricordare che interpolate è un sottomodulo di scipy. Se dovessi importare una funzione da un modulo, userei from module import function.

L'unica cosa è, essere coerente con la convenzione scelta.

+0

Preferisco la versione "import package.module as shortname", ma mi chiedevo se il "modulo di importazione pacchetto" avesse qualcosa da consigliarlo. Non "dalla funzione di importazione dei moduli" se lo si rinomina o meno, poiché mi piace avere la visibilità del modulo e il nome della funzione nel mio codice. Quindi sembra che "import full_module_name as shortname", che full_module_name abbia un prefisso del pacchetto o meno, è il modo coerente per farlo. Uso un insieme coerente di nomi brevi, che sembrano affiorare in molte fonti: - np, sp, tk, plt per esempio, npr per numpy.random ecc. –

10

No, non ci non c'è alcuna differenza tra le due affermazioni, entrambi mettono lo stesso identico oggetto nello spazio dei nomi del modulo (globals()), con lo stesso identico nome.

Si muovono in modi leggermente diversi ma il risultato finale è lo stesso.

In sostanza, il primo fa:

from scipy import interpolate 
spi = interpolate 
del interpolate 

e il secondo si riduce a

import scipy.interpolate 
spi = scipy.interpolate 
del scipy 

e alla fine tutto quello che hai è il nome spi legata alla funzione interpolate.

Personalmente, non vorrei rinominare la funzione simile, mi piacerebbe tenerlo come import scipy e usare scipy.interpolate, comunicando in modo chiaro in cui l'oggetto viene da tutto il codice, o userei from scipy import interpolate.

Rinominare l'oggetto potrebbe rendere più semplice la digitazione per te, ma potrebbe rendere più difficile per te o per altri ingannare in seguito quando rivisiterai questo codice dopo mesi di assenza.

+0

Avrei dovuto rendere più chiaro che l'interpolazione era il modulo, non la funzione. Finisco per usare f = spi.interp1d (... –

+0

@Neil_UK: il commento si applica ancora, sia che si tratti di un modulo o di una funzione. :-) Aggiustato il testo. –