Подтвердить что ты не робот

Import vs __import __() vs importlib.import_module()?

Я заметил, что Flask использовал Werkzeug для __import__ модуля, и я был немного смущен. Я пошел и проверил документы на нем и увидел, что он, кажется, дает вам больше контроля как-то с точки зрения того, где он ищет модуль, но я точно не знаю, как и у меня есть нулевое представление о том, как оно отличается от importlib.import_module.

Невероятная вещь в примере Werkzeug заключается в том, что она просто говорит __import__(import_name), поэтому я не вижу, как это отличается от использования только инструкции import, поскольку она игнорирует необязательные дополнительные параметры.

Может ли кто-нибудь объяснить? Я смотрел на других людей, которые задавали подобные вопросы ранее, но они были не очень четко сформулированы вопросы, и ответы не касались этого вообще.

4b9b3361

Ответ 1

__import__ - функция хука низкого уровня, используемая для импорта модулей; его можно использовать для динамического импорта модуля, указав имя модуля для импорта в качестве переменной, что не позволяет вам сделать оператор import.

importlib.import_module() - обертка вокруг этого крючка, чтобы создать хороший API для этой функции; это очень недавнее дополнение к Python 2 и было более сфокусировано на Python 3. Кодовые базы, которые используют __import__, обычно делают это, потому что они хотят оставаться совместимыми со старыми версиями Python 2, например. ничего перед Python 2.7.

Одним из побочных эффектов использования __import__ может быть то, что он возвращает импортированный модуль и ничего не добавляет к пространству имен; вы можете импортировать с ним, не имея затем удалить новое имя, если вы не хотите, чтобы это новое имя; использование import somename добавит somename в ваше пространство имен, но __import__('somename') вместо этого вернет импортированный модуль, который вы можете игнорировать. По этой причине Werkzeug использует крючок в одном месте.

Все остальные виды использования связаны с динамическим импортом. Werkzeug поддерживает Python 2.6, поэтому не может использовать importlib.

Ответ 2

__import__(import_name), поэтому я не вижу, как это отличается от просто используя оператор import

Оба __import__() и importlib.import_module() позволяют вам импортировать модуль, когда у вас есть имя модуля в виде строки. Вы не можете писать:

x = 're'
import x

или вы получите:

 File "1.py", line 3, in <module>
 import x ImportError: No module named x