Документация вводит вас в заблуждение, поскольку она написана для описания более распространенного случая импорта модуля извне родительского пакета, в котором он находится.
Например, использование «из подмодуля импорта примера» в моем собственном коде, где «пример» - это какая-то сторонняя библиотека, полностью не связанная с моим собственным кодом, не связывает имя «пример». Он по-прежнему импортирует оба модули example / __ init__.py и example / submodule.py, создает два объекта модуля и присваивает example.submodule второму объекту модуля.
Но "from..import" имен из подмодуля должен устанавливать атрибут submodule для объекта родительского пакета. Подумайте, нет ли:
package / __ init__.py выполняется при импорте пакета.
То, что __init__ делает "из имени импорта подмодуля".
В какой-то момент позже другой совершенно другой код делает "import package.submodule".
На шаге 3 ни sys.modules ["package.submodule"] не существует, и в этом случае его повторная загрузка даст вам два разных объекта модуля в разных областях; или sys.modules ["package.submodule"] будет существовать, но "submodule" не будет атрибутом родительского объекта пакета (sys.modules ["package"]), а "import package.submodule" ничего не будет делать. Однако, если он ничего не делает, код, использующий импорт, не может получить доступ к подмодулю как атрибут пакета!
Теоретически, как импорт подмодуля может быть изменен, если остальные механизмы импорта были изменены, чтобы соответствовать.
Если вам просто нужно знать, что будет делать импорт подмодуля S из пакета P, то вкратце:
- Убедитесь, что P импортирован, или импортируйте его другим способом. (Этот шаг повторяется для обработки «import A.B.C.D».)
- Выполните S.py, чтобы получить объект модуля. (Пропуск деталей файлов .pyc и т. Д.)
- Хранить объект модуля в sys.modules ["P.S"].
setattr(sys.modules["P"], "S", sys.modules["P.S"])
- Если этот импорт имел форму «import P.S», свяжите «P» в локальной области видимости.