Ответ 1
Документация вводит вас в заблуждение, поскольку она написана для описания более распространенного случая импорта модуля из-за пределов родительского пакета, содержащего его.
Например, используя "из примерного подмодуля импорта" в моем собственном коде, где "пример" - это некоторая сторонняя библиотека, полностью не связанная с моим собственным кодом, не связывает имя "пример". Он по-прежнему импортирует модули example/__ init__.py и example/submodule.py, создает два объекта модуля и присваивает example.submodule второму объекту модуля.
Но "from..import" имен из подмодуля должен установить атрибут подмодуля на родительском объекте пакета. Подумайте, не получилось ли это:
-
package/__ init__.py выполняется при импортировании пакета.
-
То, что __init__ делает "из имени импорта подмодуля".
-
В какой-то момент позже другой совершенно другой код выполняет "import package.submodule".
На шаге 3 либо sys.modules [ "package.submodule" ] не существует, и в этом случае его загрузка снова даст вам два разных объекта модуля в разных областях; или sys.modules [ "package.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" в локальной области.