Istnieje kilka ważnych nieporozumień, którymi należy się zająć, szczególnie w odniesieniu do terminologii. Po pierwsze, zazwyczaj, gdy sądzisz, że importujesz plik package
w pythonie, importowany plik to module
. Powinieneś używać terminu package
, gdy myślisz o podstrukturze systemu plików, która pomaga w organizacji kodu. Ale z perspektywy kodu, za każdym razem, gdy importujesz plik package
, Python traktuje go jako moduł. Wszystkie pakiety są modułami. Nie wszystkie moduły są pakietami. Moduł z atrybutem __path__
jest traktowany jako pakiet.
Możesz sprawdzić, czy os
jest modułem. Aby to potwierdzić, można zrobić:
import os
print(type(os)) # will print: <type 'module'>
W przykładzie, kiedy robisz import FooPackage
, FooPackage
traktuje i uważana za zbyt moduł, a jego atrybutami (funkcje, klasy, itd) są podobno zdefiniowane w __init__.py
. Ponieważ twój __init__.py
jest pusty, nie może znaleźć foo
.
Poza instrukcjami import
nie można używać notacji '.'
do adresowania modułów wewnątrz modułów. Jedyny wyjątek ma miejsce, jeśli plik module
zostanie zaimportowany do pliku docelowego rodzica o nazwie __init__.py
. Żeby było jasne, zróbmy kilka przykładów tutaj:
rozważyć swoją pierwotną strukturę:
FooPackage/
__init__.py
foo.py
Przypadek 1: __init__.py jest pusty plik
#FooPackage imported as a module
import FooPackage
#foo is not a name defined in `__init__.py`. Error
FooPackage.foo
#FooPackage.foo imported as a module
import FooPackage.foo
#Error, foo has not been imported. To be able to use foo like this,
#you need to do: import FooPackage.foo as foo
foo.anything
#Not error, if anything is defined inside foo.py
FooPackage.foo.anything
Przypadek 2: __init__.py ma linię import foo
w tym:
import FooPackage
#Now this is good. `foo` is sort of considered to be an attribute of
#FooPackage
FooPackage.foo
Załóżmy teraz, że foo nie jest już module
, ale jest to function
zdefiniowane w __init__.py
. jeśli wykonasz import FooPackage.foo
, wyświetli się komunikat, że foo
nie jest modułem.
Jak rozumiem, nie było pytanie, jak zaimportować submoduł - dlatego można uzyskać dostęp do modułu częściowego bez importowania tego modułu, a także jak zaimplementować coś podobnego. Edycja: Jednak twoja odpowiedź zadziała – pycoder112358