Выражение from .packages.six.moves.http_client import ...
вызывает загрузку .packages.six
first .Python всегда загружает все пакеты в ссылке на вложенный пакет для модуля.
Таким образом, .packages.six.moves.http_client
заставляет Python сначала искать urllib3.packages
, затем urllib3.packages.six
и так далее.Механизм импорта делает это путем поиска полного имени в sys.modules
, а если его там нет, запускает поиск и загрузку модулей для каждого.
В первый раз, когда это происходит, sys.modules['urllib3.packages.six']
несуществует, механизм импорта находит файл urllib3/packages/six.py
, импортирует, что за до он будет искать другие имена.
И, как вы обнаружили, сам процесс импорта six.py
файл модуля, заставляет этот модуль добавлять sys.modules['urllib3.packages.six.moves']
и дальнейшие ссылки на стандартные библиотечные модули.
Механизм импорта Python - довольно сложный зверь;справочная документация Python охватывает это всесторонне в Система импорта ;конкретные записи для поиска:
Прямой вызов __import__()
выполняет только поиск модуля и, если он найден, операцию по созданию модуля.Хотя могут возникнуть определенные побочные эффекты, например , такие как импорт родительских пакетов и обновление различных кэшей (включая sys.modules), только оператор import выполняет операцию привязки имени.
и ниже Обычные пакеты
Импорт parent.one
неявно выполнит parent/__init__.py
и parent/one/__init__.py.
Последующий импорт parent.two
илиparent.three
выполнит parent/two/__init__.py
и parent/three/__init__.py
соответственно.
и Кэш модуля :
Первое место, проверенное при поиске импорта, - sys.modules
.Это отображение служит кешем всех ранее импортированных модулей, , включая промежуточные пути .Поэтому, если foo.bar.baz
был ранее импортирован, sys.modules
будет содержать записи для foo
, foo.bar
и foo.bar.baz
.Каждый ключ будет иметь в качестве значения соответствующий объект модуля.
(жирный акцент в цитатных разделах добавлен мной).
Обратите внимание, что все в *Каталог 1075 * представляет собой вендор пакет;проект, который обычно устанавливается независимо, но проект urllib3
решил собрать в свой собственный дистрибутив, чтобы не волноваться о том, какие версии поддерживать.six
- это такой независимый проект, вы можете установить его из PyPI .
Более подробную информацию о six.moves
виртуальном пакете можно найти в six
проектная документация .Его цель - облегчить разработчикам библиотек написание кода, совместимого как с Python 2, так и с Python 3, не беспокоясь о том, какое стандартное имя библиотеки импортировать в любую из версий.