Автор оригинала: Chris.
Python’s Встроенный Функция “dunder” __import __ ()
позволяет вам Импортировать библиотеку по имени . Например, вы можете импортировать библиотеку, которая была предоставлена как Пользовательский ввод Таким образом, у вас может быть только строковое имя библиотеки. Например, динамически импортировать Numpy Library, вы можете запустить __import __ («Numpy»)
Отказ
В этом руководстве я покажу вам, как использовать __import __ ()
Функция для настройки поведения импорта вашей программы Python – и импортирует модуль по имени (String). Это мощная функция, которая должна использоваться только усовершенствованными кодаваторами. Но тот факт, что вы читаете, это уже показывает, что вы знаете, что вы делаете. Итак, давайте перейдем дальше, чтобы узнать об этом аккуратному питону!
Обратите внимание, что обычно рекомендуется использовать ImportLib Модуль Если ваша единственная цель – импортировать модуль по имени.
Пример использования __import __ ()
Следующий код показывает, как использовать функцию встроенного __iMport __ () для импорта Numpy Library и назначить его названию numpy
Отказ Это семантически эквивалентно написать Импорт numpy
Отказ
numpy = __import__('numpy', globals(), locals(), [], 0) # Semantically equivalent to: import numpy a = numpy.array([1, 2, 3]) print(a * 2) # [2 4 6]
Синтаксис __import __ ()
__import__(name, globals=None, locals=None, fromlist=(), level=0)
Аргумент: | имя | нить. Имя библиотеки, которую нужно импортировать. |
Аргумент: | толковый словарь. По желанию. Словарь имени: объектные сопоставления, которые определяют имена в контексте импорта. Например, это может быть результатом функции глобалей (), если вы хотите использовать ваш текущий глобальный контекст. | |
Аргумент: | толковый словарь. По желанию. Словарь имени: объектные сопоставления, которые определяют имена в контексте импорта. Например, это может быть результатом функции Local (), если вы хотите использовать текущий локальный контекст. | |
Аргумент: | Proflist = () | считать. По желанию. Позволяет импортировать только определенные объекты, а не весь модуль. |
Аргумент: | Целое число. По желанию. Используйте абсолютный или относительный импорт. -1 -> По умолчанию – 1, указывающий, что будут предприняты как абсолютный, так и относительный импорт. 0 -> Только абсолютный импорт X> 0 -> Поиск X родительских каталогов относительно модуля, вызывающего __import __ (). | |
Возвращаемое значение | объект | Импортированный модуль объект. |
Почему __iMport __ () обескуражен?
Если вы используете оператор импорта, например, в Импорт numpy
, он внутренне использует встроенный функцию __iMport __ () как семантически более мощную базовую реализацию.
Вы можете заменить это поведение и настроить его на необходимость, выполняя функцию __iMport __ () самостоятельно. Однако вы не должны делать это, так как оно может вызвать опасные побочные эффекты. Например, PEP 302 документ Явно обескуражил это. Вы можете спросить: почему?
Почему __Импортировать__() Разговаривать в соответствии с PEP 302?
Перезаписывать __import __ ()
Функция вызывает три проблемы:
- Вам нужно переоценить механизм импорта. Но вы можете изменить только маленькую вещь.
- Он имеет сложную семантику и обязанности. Это может вводить новые источники ошибок в ваш код.
- Даже системные модули в
Sys.modules
Позвоните__import __ ()
Отказ Итак, если вы перезаписываете его, вы попадаете с хорошо проверенным глобальным кодом.
Вместо этого PEP 302 советует использовать проще импортные крюки Отказ Вы можете спросить:
Что такое импортные крючки?
Они являются более чистым способом динамически импортных библиотек, учитывая их имя (и, возможно, путь). Вот соответствующие части от PEP 302:
– Начало источника PEP 302 –
Протокол включает в себя два объекта: A искатель и а погрузчик Отказ Объект Finder имеет один метод:
finder.find_module(fullname, path=None)
Этот метод будет вызван с полностью квалифицированным названием модуля. Если поиск установлен на sys.meta_path
Он получит второй аргумент, который не является ним для модуля верхнего уровня, или пакет .__ path__
для подмодулей или подразделений. Он должен вернуть объект погрузчика, если модуль был найден или Нет
Если это не было. Если find_module ()
Поднимает исключение, он будет распространен абоненту, прерванию импорта.
Объект погрузчика также имеет один метод:
loader.load_module(fullname)
Этот метод возвращает загруженный модуль или повышает исключение, предпочтительно ImportError
Если существующее исключение не распространяется. Если load_module ()
просят загрузить модуль, который он не может, ImportError
должен быть поднят.
– Конец источника PEP 302 –
Как получается, библиотека ImportLib.import_module ()
реализует то, что вам нужно, и вы должны использовать его вместо __import __ ()
функция.
Резюме
Python’s Встроенный Функция “dunder” __import __ ()
Позволяет импортировать библиотеку по имени, если у вас есть только доступ к имени библиотеки в виде строки.
Например, вы можете импортировать библиотеку, которая была предоставлена в качестве пользовательского ввода. Например, динамически импортировать Numpy Library, вы можете запустить __import __ («Numpy»)
Отказ
numpy = __import__('numpy', globals(), locals(), [], 0) # Semantically equivalent to: import numpy a = numpy.array([1, 2, 3]) print(a * 2) # [2 4 6]
__import __ ()
Функция не рекомендуется. Если вам нужно импортировать библиотеки по имени, рекомендуемый способ – использовать ImportLib библиотека.
Хотите увеличить свои навыки Python в веселой и легкой потребности? Рассмотрим следующие ресурсы и стать магистральным кодером!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Оригинал: “https://blog.finxter.com/python-__import__/”