Почему импорт модуля Python не импортирует вложенные модули? - PullRequest
11 голосов
/ 16 февраля 2012

Если я сделаю это:

import lxml 

в python, lxml.html не импортируется.Например, я не могу вызвать функцию lxml.html.parse().Почему это так?

Ответы [ 5 ]

12 голосов
/ 16 февраля 2012

Импорт модуля или пакета в Python является концептуально простой операцией:

  1. Найдите файл .py, соответствующий импорту.Это включает путь Python и некоторые другие механизмы, но приведет к тому, что будет найден определенный файл .py.

  2. Для каждого уровня каталога в импорте (import foo.bar.baz имеет два уровня),найдите соответствующий файл __init__.py и выполните его.Выполнение этого просто означает выполнение всех операторов верхнего уровня в файле.

  3. Наконец, выполняется сам файл .py (в данном случае foo/bar/baz.py), то есть все файлы верхнего уровня.заявления уровня выполнены.Все глобальные переменные, созданные в результате этого выполнения, объединяются в объект модуля, и этот объект модуля является результатом импорта.

Если ни один из этих шагов не импортировал подпакеты,тогда эти подпакеты недоступны.Если они импортировали подпакеты, то они доступны.Авторы пакетов могут делать все, что пожелают.

6 голосов
/ 16 февраля 2012

lxml в Python называется пакетом , представляющим собой иерархическую коллекцию модулей.Пакеты могут быть огромными, поэтому им разрешается избирательно выбирать то, что загружается при импорте.В противном случае всем пришлось бы импортировать всю иерархию, что было бы пустой тратой ресурсов.

4 голосов
/ 16 февраля 2012

Это по замыслу.Пакет имеет возможность импортировать вложенный пакет в его __init__.py, тогда вы сможете без проблем получить доступ к вложенному пакету.Это вопрос выбора для создателя пакета, и цель состоит в том, чтобы минимизировать объем кода, который вы, вероятно, не будете использовать.

2 голосов
/ 16 февраля 2012

lxml - это пакет, а не модуль.Пакет представляет собой набор модулей.Как это бывает, вы также можете импортировать пакет напрямую, но он не импортирует автоматически все его подмодули.

Что касается , почему , это вопрос BDFL.,Я думаю, что это, вероятно, потому что пакеты, как правило, довольно большие, и импорт всех подмодулей будет чрезмерным снижением производительности.

1 голос
/ 16 февраля 2012

Это позволяет загружать только минимальный объем кода для библиотек, состоящих из нескольких частей, которые вы не можете использовать полностью. Например, вы не можете использовать html часть lxml и, следовательно, не хотите иметь дело с загрузкой его кода.

...