Есть несколько важных заблуждений, которые необходимо устранить, особенно с помощью терминологии.Во-первых, обычно, когда вы думаете, что импортируете package
в python, вы фактически импортируете module
.Вы должны использовать термин package
, когда вы думаете о терминах подструктуры файловой системы, которая помогает вам организовать ваш код.Но с точки зрения кода, всякий раз, когда вы импортируете package
, Python рассматривает его как модуль.Все пакеты являются модулями.Не все модули являются пакетами.Модуль с атрибутом __path__
считается пакетом.
Вы можете проверить, что os
является модулем.Чтобы подтвердить это, вы можете сделать:
import os
print(type(os)) # will print: <type 'module'>
В вашем примере, когда вы делаете import FooPackage
, FooPackage
обрабатывается и считается также модулем, и его атрибутами (функциями, классами и т. Д.).) предположительно определены в __init__.py
.Поскольку ваш __init__.py
пуст, он не может найти foo
.
Вне операторов import
вы не можете использовать запись '.'
для адресации модулей внутри модулей.Единственное исключение происходит, если module
импортируется в файл пакета предполагаемого родителя __init__.py
.Чтобы прояснить ситуацию, давайте сделаем несколько примеров:
Рассмотрим исходную структуру:
FooPackage/
__init__.py
foo.py
Случай 1: __init__.py - пустой файл
#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
Случай 2: в __init__.py есть строка import foo
:
import FooPackage
#Now this is good. `foo` is sort of considered to be an attribute of
#FooPackage
FooPackage.foo
Теперь предположим, что foo больше не является module
, аfunction
, который вы определили в __init__.py
.если вы сделаете import FooPackage.foo
, появится сообщение о том, что foo
не является модулем.