Такое поведение можно объяснить кратким изложением того, что происходит, когда вы импортируете модуль baz
с оператором, подобным import foo.bar.baz
.
1: импорт родительских модулей
Прежде чем baz
может быть импортирован, bar
должен быть там. И прежде чем bar
может быть импортирован, необходимо наличие foo
- у python нет способа достичь baz
с помощью ярлыка.
2: запуск __init__.py
файлов
В каждом пакете, который импортируется до baz
, имеется файл __init__.py
, который выполняется.
3: загрузка обнаруженных модулей в sys.modules
при импорте папкикак пакет, все файлы Python в нем импортируются как модули (за исключением файлов __init__.py
, которые можно представить себе как замену для самого пакета). Они будут загружены в sys.modules
и доступны объектам пакета (в данном случае это foo
, `` bar , and
baz`).
И это в значительной степени так,подробности можно найти здесь .
В вашем примере были выполнены два оператора import
(один вами и один при запуске first_package/__init__.py
), но только первыйНужно объяснить, что случилось. Когда вы импортировали first_package
, третий шаг загружает все модули, которые являются частью пакета. Это включает sub_package
, и нет никакого способа обойти это, используя стандартные механизмы импорта.
Выполнение
del first_pacakge.sub_package
удалит его из объекта на тот случай, если вы заботитесь только об этом, но не выгружает его и все равно будет в sys.modules
.