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

Mam wiele importów modułów, które są takie same w foo.py, bar.py i baz.py.Importowanie w pakiecie Pythona

Czy istnieje sposób, w jaki mogę dokonać przywozu w __init__.py? Co powinienem napisać w foo.py?

Odpowiedz

1

Umieszczenie przywozu w __init__.py byłoby złym pomysłem; __init__.py jest używany jako zawartość twojego obiektu modułu, więc jest to interfejs publiczny. Ponadto, __init_.py jest importowany początkowo po zaimportowaniu pakietu, podczas gdy w rzeczywistości nie potrzebujesz importu, dopóki twoje podmoduły ich nie potrzebują.

Najlepszym rozwiązaniem jest umieszczenie wspólnego kodu w wewnętrznym module szczegółowym, oznaczonym pojedynczym początkowym znakiem podkreślenia (oznaczającym "prywatny"), np. _imports.py, następnie w innych plikach napisz from ._imports import *.

1

Zgadłeś, jak to zrobić, ale mogę uczynić to nieco bardziej formalnym i dać (mam nadzieję) lepsze wyjaśnienie niż to, które znalazłeś gdzie indziej. Jeśli chcesz modularyzować import, który w zależności od filozofii kodowania może być dobrym lub złym pomysłem samym w sobie (przezroczystość a ponowne użycie kodu), niezależnie od tego, czy import ma miejsce w __init__.py, możesz zaimportować import z innego skryptu. Na przykład:

"""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 

Import z __init__.py jest w większości takie same, wystarczy użyć tradycyjnie względną importu zamiast jeśli masz dostępu do niego z tego samego modułu:

# To import form __init__ 
from . import * 

Ważne, aby pamiętać jednak, że Tego rodzaju importowanie będzie działać tylko wtedy, gdy uruchomisz te skrypty python jawnie jako moduły, a nie jako skrypty. To znaczy:

python -m foo 

zamiast

python foo.py 

ważna, ale subtelną różnicę.

Nadzieję, że pomaga. Daj mi znać, jeśli masz więcej pytań.

+0

+1 Dzięki za subtelne wyróżnienie! – ksindi

Powiązane problemy