2014-04-09 13 views
5
pkg/ 
    __init__.py 
    foo.py 
    bar.py 
    baz.py 

Ho un mucchio di importazioni di moduli uguali su foo.py, bar.py e baz.py.Importazione attraverso un pacchetto python

C'è un modo per eseguire le importazioni in __init__.py? Cosa dovrei scrivere in foo.py?

risposta

1

Posizionare le importazioni in __init__.py sarebbe una cattiva idea; __init__.py viene utilizzato come contenuto dell'oggetto modulo, quindi è un'interfaccia pubblica. Inoltre, __init_.py viene importato inizialmente quando il pacchetto viene importato, mentre non è effettivamente necessario che le importazioni si verifichino finché i sottomoduli non ne hanno bisogno.

L'approccio migliore è inserire codice comune in un modulo di dettaglio interno, contrassegnato da un singolo trattino di sottolineatura iniziale (che significa "privato"), ad es. _imports.py, quindi negli altri file scrivi from ._imports import *.

1

Hai indovinato il modo giusto per farlo, ma posso renderlo un po 'più formale e dare (si spera) una spiegazione più chiara di quella che hai trovato altrove. Se vuoi modulare le importazioni, che a seconda della tua filosofia di codifica potrebbero essere un'idea buona o cattiva di per sé (trasparenza rispetto al riutilizzo del codice), indipendentemente dal fatto che le importazioni avvengano o meno in __init__.py puoi importare le tue importazioni da un altro script. Per esempio:

"""import_scripts.py""" 
import numpy as np 
import scipy as sp 
... 

"""actual_code.py""" 
from import_scripts import * 
# np and sp are now in scope 

Importazione da __init__.py è in gran parte la stessa, basta tradizionalmente utilizza un import relativa, invece, se si sta accedendo dalla stesso modulo:

# To import form __init__ 
from . import * 

importante notare, però, che questo tipo di importazioni funzionerà solo se si eseguono questi script Python esplicitamente come moduli anziché come script. Ciò significa:

python -m foo 

invece di

python foo.py 

Importante, ma sottile distinzione.

Spero che questo aiuti. Fammi sapere se hai altre domande.

+0

+1 Grazie per la sottile distinzione! – ksindi

Problemi correlati