importlib — Реализация import

Добавлено в версии 3.1.

Исходный код: Lib/importlib/__init__.py.


Введение

Цель пакета importlib двояка. Первая - предоставить реализацию оператора import (и, следовательно, функцию __import__()) в исходном коде Python. Это обеспечивает реализацию import, которая переносима в любой интерпретатор Python. Это также обеспечивает реализацию, которую легче понять, чем ту, которая реализована на языке программирования, отличном от Python.

Во-вторых, компоненты для реализации import раскрыты в этом пакете, что облегчает пользователям создание собственных пользовательских объектов (известных как importer) для участия в процессе импорта.

См.также

Оператор import

Ссылка на язык для оператора import.

Packages specification

Оригинальная спецификация пакетов. Некоторые семантики изменились с момента написания этого документа (например, перенаправление на основе None в sys.modules).

Функция __import__()

Оператор import является синтаксическим сахаром для этой функции.

PEP 235

Импорт на платформы, нечувствительные к регистру

PEP 263

Определение кодировок исходного кода Python

PEP 302

Новые импортные крючки

PEP 328

Импорт: Многострочный и абсолютный/относительный

PEP 366

Явные относительные импорты главного модуля

PEP 420

Неявные пакеты пространства имен

PEP 451

Тип ModuleSpec для системы импорта

PEP 488

Ликвидация файлов PYO

PEP 489

Многофазная инициализация модуля расширения

PEP 552

Детерминированный pycs

PEP 3120

Использование UTF-8 в качестве кодировки источника по умолчанию

PEP 3147

Справочники репозитория PYC

Функции

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)

Реализация встроенной функции __import__().

Примечание

При программном импорте модулей вместо этой функции следует использовать import_module().

importlib.import_module(name, package=None)

Импортировать модуль. Аргумент name указывает, какой модуль импортировать в абсолютном или относительном выражении (например, pkg.mod или ..mod). Если имя указано в относительных терминах, то аргумент package должен быть установлен в имя пакета, который будет действовать как якорь для разрешения имени пакета (например, import_module('..mod', 'pkg.subpkg') будет импортировать pkg.mod).

Функция import_module() действует как упрощающая обертка вокруг importlib.__import__(). Это означает, что вся семантика функции вытекает из importlib.__import__(). Наиболее важным различием между этими двумя функциями является то, что import_module() возвращает указанный пакет или модуль (например, pkg.mod), в то время как __import__() возвращает пакет или модуль верхнего уровня (например, pkg).

Если вы динамически импортируете модуль, который был создан после того, как интерпретатор начал выполнение (например, создал исходный файл Python), вам может понадобиться вызвать invalidate_caches() для того, чтобы новый модуль был замечен системой импорта.

Изменено в версии 3.3: Родительские пакеты импортируются автоматически.

importlib.find_loader(name, path=None)

Найти загрузчик для модуля, по желанию в указанном пути. Если модуль находится в sys.modules, то возвращается sys.modules[name].__loader__ (если только загрузчик не будет None или не установлен, в этом случае выдается ValueError). В противном случае выполняется поиск с использованием sys.meta_path. Если загрузчик не найден, возвращается None.

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

Добавлено в версии 3.3.

Изменено в версии 3.4: Если __loader__ не установлен, поднимите ValueError, как и в случае, когда атрибут установлен в None.

Не рекомендуется, начиная с версии 3.4: Вместо этого используйте importlib.util.find_spec().

importlib.invalidate_caches()

Аннулировать внутренние кэши искателей, хранящиеся по адресу sys.meta_path. Если искатель реализует invalidate_caches(), то будет вызвана эта функция для выполнения аннулирования. Эта функция должна вызываться, если во время работы вашей программы создаются/устанавливаются какие-либо модули, чтобы гарантировать, что все искатели заметят существование нового модуля.

Добавлено в версии 3.3.

importlib.reload(module)

Перезагрузить ранее импортированный модуль. Аргумент должен быть объектом модуля, поэтому он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python. Возвращаемым значением является объект модуля (который может быть другим, если при повторном импорте в sys.modules будет помещен другой объект).

Когда выполняется reload():

  • Код модуля Python перекомпилируется и код на уровне модуля выполняется заново, определяя новый набор объектов, которые привязываются к именам в словаре модуля путем повторного использования функции loader, которая первоначально загрузила модуль. Функция init модулей расширения не вызывается второй раз.

  • Как и все другие объекты в Python, старые объекты восстанавливаются только после того, как количество ссылок на них упадет до нуля.

  • Имена в пространстве имен модуля обновляются, чтобы указать на все новые или измененные объекты.

  • Другие ссылки на старые объекты (например, имена, внешние по отношению к модулю) не могут ссылаться на новые объекты и должны быть обновлены в каждом пространстве имен, где они встречаются, если это необходимо.

Есть и ряд других предостережений:

Когда модуль перезагружается, его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имен отменяют старые определения, так что обычно это не является проблемой. Если в новой версии модуля не определено имя, которое было определено в старой версии, то старое определение сохраняется. Эта возможность может быть использована в интересах модуля, если он поддерживает глобальную таблицу или кэш объектов — с помощью оператора try можно проверить наличие таблицы и пропустить ее инициализацию при желании:

try:
    cache
except NameError:
    cache = {}

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

Если модуль импортирует объекты из другого модуля с помощью fromimport …, вызов reload() для другого модуля не переопределяет импортированные из него объекты — одним из способов обойти это является повторное выполнение оператора from, другим - использование import и квалифицированных имен (module.name) вместо этого.

Если модуль инстанцирует экземпляры класса, перезагрузка модуля, определяющего класс, не влияет на определения методов этих экземпляров - они продолжают использовать старое определение класса. То же самое справедливо и для производных классов.

Добавлено в версии 3.4.

Изменено в версии 3.7: ModuleNotFoundError возникает, если в перезагружаемом модуле отсутствует ModuleSpec.

importlib.abc – Абстрактные базовые классы, связанные с импортом

Исходный код: Lib/importlib/abc.py.


Модуль importlib.abc содержит все основные абстрактные базовые классы, используемые import. Некоторые подклассы основных абстрактных базовых классов также предоставляются для помощи в реализации основных ABC.

Иерархия ABC:

object
 +-- Finder (deprecated)
 +-- MetaPathFinder
 +-- PathEntryFinder
 +-- Loader
      +-- ResourceLoader --------+
      +-- InspectLoader          |
           +-- ExecutionLoader --+
                                 +-- FileLoader
                                 +-- SourceLoader
class importlib.abc.Finder

Абстрактный базовый класс, представляющий finder.

Не рекомендуется, начиная с версии 3.3: Вместо этого используйте MetaPathFinder или PathEntryFinder.

abstractmethod find_module(fullname, path=None)

Абстрактный метод для поиска loader для указанного модуля. Первоначально указанный в PEP 302, этот метод был предназначен для использования в sys.meta_path и в подсистеме импорта на основе пути.

Изменено в версии 3.4: Возвращает None при вызове вместо повышения NotImplementedError.

Не рекомендуется, начиная с версии 3.10: Вместо этого используйте MetaPathFinder.find_spec() или PathEntryFinder.find_spec().

class importlib.abc.MetaPathFinder

Абстрактный базовый класс, представляющий meta path finder.

Добавлено в версии 3.3.

Изменено в версии 3.10: Больше не является подклассом Finder.

find_spec(fullname, path, target=None)

Абстрактный метод для поиска spec для указанного модуля. Если это импорт верхнего уровня, path будет None. В противном случае, это поиск подпакета или модуля, и path будет значением __path__ из родительского пакета. Если спецификация не может быть найдена, возвращается None. При передаче target является объектом модуля, который может быть использован искателем для более точного предположения о том, какую спецификацию вернуть. importlib.util.spec_from_loader() может быть полезен для реализации конкретных MetaPathFinders.

Добавлено в версии 3.4.

find_module(fullname, path)

Унаследованный метод для поиска loader для указанного модуля. Если это импорт верхнего уровня, path будет None. В противном случае, это поиск подпакета или модуля, и path будет значением __path__ из родительского пакета. Если загрузчик не может быть найден, возвращается значение None.

Если определено find_spec(), то обеспечивается обратная совместимость.

Изменено в версии 3.4: Возвращает None при вызове вместо того, чтобы поднимать NotImplementedError. Может использовать find_spec() для обеспечения функциональности.

Не рекомендуется, начиная с версии 3.4: Вместо этого используйте find_spec().

invalidate_caches()

Необязательный метод, который при вызове должен аннулировать любой внутренний кэш, используемый искателем. Используется importlib.invalidate_caches() при аннулировании кэшей всех искателей на sys.meta_path.

Изменено в версии 3.4: Возвращает None при вызове вместо NotImplemented.

class importlib.abc.PathEntryFinder

Абстрактный базовый класс, представляющий path entry finder. Хотя он имеет некоторое сходство с MetaPathFinder, PathEntryFinder предназначен для использования только в подсистеме импорта на основе путей, предоставляемой importlib.machinery.PathFinder.

Добавлено в версии 3.3.

Изменено в версии 3.10: Больше не является подклассом Finder.

find_spec(fullname, target=None)

Абстрактный метод для поиска spec для указанного модуля. Поисковик будет искать модуль только в пределах path entry, которому он присвоен. Если модуль не может быть найден, возвращается None. При передаче target является объектом модуля, который искатель может использовать для более точного предположения о том, какую спецификацию вернуть. importlib.util.spec_from_loader() может быть полезен для реализации конкретных PathEntryFinders.

Добавлено в версии 3.4.

find_loader(fullname)

Унаследованный метод для поиска loader для указанного модуля. Возвращает кортеж из (loader, portion), где portion - последовательность расположений файловой системы, вносящих вклад в часть пакета пространства имен. Загрузчик может быть None при указании portion для обозначения вклада расположений файловой системы в пакет пространства имен. Пустой список может быть использован для portion, чтобы указать, что загрузчик не является частью пакета пространства имен. Если loader является None и portion является пустым списком, то загрузчик или расположение для пакета пространства имен не найдены (т.е. для модуля ничего не найдено).

Если определено find_spec(), то обеспечивается обратная совместимость.

Изменено в версии 3.4: Возвращает (None, []) вместо того, чтобы поднимать NotImplementedError. Использует find_spec(), когда это доступно для обеспечения функциональности.

Не рекомендуется, начиная с версии 3.4: Вместо этого используйте find_spec().

find_module(fullname)

Конкретная реализация Finder.find_module(), которая эквивалентна self.find_loader(fullname)[0].

Не рекомендуется, начиная с версии 3.4: Вместо этого используйте find_spec().

invalidate_caches()

Необязательный метод, который при вызове должен аннулировать любой внутренний кэш, используемый искателем. Используется importlib.machinery.PathFinder.invalidate_caches() при аннулировании кэшей всех кэшированных искателей.

class importlib.abc.Loader

Абстрактный базовый класс для loader. Точное определение загрузчика см. в PEP 302.

Загрузчики, которые хотят поддерживать чтение ресурсов, должны реализовать метод get_resource_reader(fullname), как указано в importlib.abc.ResourceReader.

Изменено в версии 3.7: Введен необязательный метод get_resource_reader().

create_module(spec)

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

Добавлено в версии 3.4.

Изменено в версии 3.5: Начиная с Python 3.6, этот метод не будет необязательным, если определено exec_module().

exec_module(module)

Абстрактный метод, который выполняет модуль в его собственном пространстве имен, когда модуль импортируется или перезагружается. Модуль уже должен быть инициализирован, когда вызывается exec_module(). Когда этот метод существует, create_module() должен быть определен.

Добавлено в версии 3.4.

Изменено в версии 3.6: create_module() также должен быть определен.

load_module(fullname)

Унаследованный метод для загрузки модуля. Если модуль не может быть загружен, выдается сообщение ImportError, в противном случае возвращается загруженный модуль.

Если запрашиваемый модуль уже существует в sys.modules, этот модуль должен быть использован и перезагружен. В противном случае загрузчик должен создать новый модуль и вставить его в sys.modules до начала загрузки, чтобы предотвратить рекурсию от импорта. Если загрузчик вставил модуль и загрузка не удалась, он должен быть удален загрузчиком из sys.modules; модули, уже находившиеся в sys.modules до начала выполнения загрузчиком, должны быть оставлены в покое (см. importlib.util.module_for_loader()).

Загрузчик должен установить несколько атрибутов модуля. (Обратите внимание, что некоторые из этих атрибутов могут меняться при перезагрузке модуля):

  • __name__

    Имя модуля.

  • __file__

    Путь к месту хранения данных модуля (не задается для встроенных модулей).

  • __cached__

    Путь к месту, где хранится/должна храниться скомпилированная версия модуля (не задается, если атрибут был бы неуместен).

  • __path__

    Список строк, указывающих путь поиска внутри пакета. Этот атрибут не устанавливается для модулей.

  • __package__

    Полное имя пакета, под которым модуль был загружен как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов это то же самое, что и __name__. Декоратор importlib.util.module_for_loader() может обработать детали для __package__.

  • __loader__

    Загрузчик, используемый для загрузки модуля. Декоратор importlib.util.module_for_loader() может обрабатывать детали для __package__.

Если доступно exec_module(), то обеспечивается обратно совместимая функциональность.

Изменено в версии 3.4: Поднимайте ImportError при вызове вместо NotImplementedError. Функциональность, предоставляемая при наличии exec_module().

Не рекомендуется, начиная с версии 3.4: Рекомендуемый API для загрузки модуля - exec_module()create_module()). Загрузчики должны реализовывать его вместо load_module(). Механизм импорта берет на себя все остальные обязанности load_module(), когда реализуется exec_module().

module_repr(module)

Унаследованный метод, который при реализации вычисляет и возвращает repr данного модуля в виде строки. Метод repr() по умолчанию типа модуля будет использовать результат этого метода по мере необходимости.

Добавлено в версии 3.3.

Изменено в версии 3.4: Сделан опциональным вместо абстрактного метода.

Не рекомендуется, начиная с версии 3.4: Теперь механизм импорта заботится об этом автоматически.

class importlib.abc.ResourceReader

Заменен на TraversableResources.

abstract base class для обеспечения возможности чтения ресурсов.

С точки зрения данного букваря, ресурс - это двоичный артефакт, который поставляется в составе пакета. Обычно это что-то вроде файла данных, который живет рядом с файлом __init__.py пакета. Цель этого класса - помочь абстрагироваться от доступа к таким файлам данных, чтобы не имело значения, хранится ли пакет и его файл(ы) данных в файле, например, zip, или в файловой системе.

Для любого из методов этого класса аргумент resource должен быть path-like object, который концептуально представляет собой просто имя файла. Это означает, что в аргумент resource не следует включать пути к подкаталогам. Это происходит потому, что в качестве «каталога» выступает местоположение пакета, для которого предназначен считыватель. Отсюда метафора для каталогов и имен файлов - пакеты и ресурсы, соответственно. Именно поэтому ожидается, что экземпляры этого класса будут напрямую соотноситься с конкретным пакетом (вместо того, чтобы потенциально представлять несколько пакетов или модуль).

Загрузчики, которые хотят поддерживать чтение ресурсов, должны предоставлять метод get_resource_reader(fullname), который возвращает объект, реализующий интерфейс этого ABC. Если модуль, указанный в fullname, не является пакетом, этот метод должен возвращать None. Объект, совместимый с данным ABC, должен возвращаться только в том случае, если указанный модуль является пакетом.

Добавлено в версии 3.7.

abstractmethod open_resource(resource)

Возвращает открытый, file-like object для двоичного чтения ресурс.

Если ресурс не может быть найден, выдается сообщение FileNotFoundError.

abstractmethod resource_path(resource)

Возвращает путь файловой системы к ресурсу.

Если ресурс конкретно не существует в файловой системе, поднимите FileNotFoundError.

abstractmethod is_resource(name)

Возвращает True, если имя name считается ресурсом. Возвращается FileNotFoundError, если name не существует.

abstractmethod contents()

Возвращает iterable строк по содержимому пакета. Обратите внимание, что не обязательно, чтобы все имена, возвращаемые итератором, были реальными ресурсами, например, допустимо возвращать имена, для которых is_resource() будет false.

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

Абстрактный метод возвращает итерабельную таблицу без элементов.

class importlib.abc.ResourceLoader

Абстрактный базовый класс для loader, который реализует дополнительный протокол PEP 302 для загрузки произвольных ресурсов из внутреннего хранилища.

Не рекомендуется, начиная с версии 3.7: Этот ABC устарел в пользу поддержки загрузки ресурсов через importlib.abc.ResourceReader.

abstractmethod get_data(path)

Абстрактный метод для возврата байтов для данных, расположенных по адресу path. Загрузчики, имеющие файлоподобное хранилище, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод для предоставления прямого доступа к хранимым данным. Если путь не может быть найден, будет выдано сообщение OSError. Ожидается, что путь будет построен с использованием атрибута __file__ модуля или элемента из __path__ пакета.

Изменено в версии 3.4: Поднимает OSError вместо NotImplementedError.

class importlib.abc.InspectLoader

Абстрактный базовый класс для loader, который реализует дополнительный протокол PEP 302 для загрузчиков, проверяющих модули.

get_code(fullname)

Возвращает объект кода для модуля, или None, если модуль не имеет объекта кода (как, например, в случае встроенного модуля). Вызовите сообщение ImportError, если загрузчик не может найти запрашиваемый модуль.

Примечание

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

Изменено в версии 3.4: Больше не является абстрактным и имеет конкретную реализацию.

abstractmethod get_source(fullname)

Абстрактный метод для возврата исходного текста модуля. Возвращается в виде текстовой строки с использованием universal newlines, переводя все распознанные разделители строк в символы '\n'. Возвращает None, если источник недоступен (например, встроенный модуль). Возвращает ImportError, если загрузчик не может найти указанный модуль.

Изменено в версии 3.4: Поднимает ImportError вместо NotImplementedError.

is_package(fullname)

Необязательный метод, возвращающий значение true, если модуль является пакетом, и false в противном случае. ImportError выдается, если loader не может найти модуль.

Изменено в версии 3.4: Поднимает ImportError вместо NotImplementedError.

static source_to_code(data, path='<string>')

Создайте объект кода из источника Python.

Аргумент data может быть любым, который поддерживает функция compile() (т.е. строка или байт). Аргумент path должен представлять собой «путь» к месту, откуда взят исходный код, который может быть абстрактным понятием (например, расположение в zip-файле).

С последующим объектом кода можно выполнить его в модуле, выполнив exec(code, module.__dict__).

Добавлено в версии 3.4.

Изменено в версии 3.5: Сделал метод статическим.

exec_module(module)

Реализация Loader.exec_module().

Добавлено в версии 3.4.

load_module(fullname)

Реализация Loader.load_module().

Не рекомендуется, начиная с версии 3.4: используйте exec_module() вместо этого.

class importlib.abc.ExecutionLoader

Абстрактный базовый класс, наследующийся от InspectLoader, который, будучи реализованным, помогает модулю выполняться как сценарий. ABC представляет необязательный протокол PEP 302.

abstractmethod get_filename(fullname)

Абстрактный метод, который должен вернуть значение __file__ для указанного модуля. Если путь недоступен, выдается сообщение ImportError.

Если исходный код доступен, то метод должен вернуть путь к исходному файлу, независимо от того, был ли использован байткод для загрузки модуля.

Изменено в версии 3.4: Поднимает ImportError вместо NotImplementedError.

class importlib.abc.FileLoader(fullname, path)

Абстрактный базовый класс, который наследуется от ResourceLoader и ExecutionLoader, предоставляя конкретные реализации ResourceLoader.get_data() и ExecutionLoader.get_filename().

Аргумент fullname - это полностью разрешенное имя модуля, с которым должен работать загрузчик. Аргумент path - путь к файлу для модуля.

Добавлено в версии 3.3.

name

Имя модуля, с которым может работать загрузчик.

path

Путь к файлу модуля.

load_module(fullname)

Вызывает команду super’s load_module().

Не рекомендуется, начиная с версии 3.4: Вместо этого используйте Loader.exec_module().

abstractmethod get_filename(fullname)

Возвращает path.

abstractmethod get_data(path)

Читает path как двоичный файл и возвращает байты из него.

class importlib.abc.SourceLoader

Абстрактный базовый класс для реализации загрузки исходных файлов (и, по желанию, байткода). Класс наследуется от ResourceLoader и ExecutionLoader, требуя реализации:

Абстрактные методы, определенные этим классом, предназначены для добавления необязательной поддержки файлов байткода. Если не реализовать эти необязательные методы (или заставить их вызывать ошибку NotImplementedError), загрузчик будет работать только с исходным кодом. Реализация этих методов позволяет загрузчику работать с файлами исходного и байткода; она не позволяет выполнять загрузку без источника, когда предоставляется только байткод. Файлы байткода - это оптимизация для ускорения загрузки путем удаления этапа разбора компилятора Python, поэтому API, специфичный для байткода, не используется.

path_stats(path)

Необязательный абстрактный метод, который возвращает dict, содержащий метаданные об указанном пути. Поддерживаются следующие ключи словаря:

  • 'mtime' (обязательно): целое число или число с плавающей точкой, представляющее время модификации исходного кода;

  • 'size' (необязательно): размер в байтах исходного кода.

Любые другие ключи в словаре игнорируются, чтобы обеспечить возможность будущих расширений. Если путь не может быть обработан, выдается сообщение OSError.

Добавлено в версии 3.3.

Изменено в версии 3.4: Поднимите OSError вместо NotImplementedError.

path_mtime(path)

Необязательный абстрактный метод, который возвращает время модификации для указанного пути.

Не рекомендуется, начиная с версии 3.3: Этот метод устарел в пользу path_stats(). Вы не обязаны его реализовывать, но он все еще доступен для совместимости. Вызов OSError, если путь не может быть обработан.

Изменено в версии 3.4: Поднимите OSError вместо NotImplementedError.

set_data(path, data)

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

Если запись в путь не удается, потому что путь доступен только для чтения (errno.EACCES/PermissionError), не распространяйте исключение.

Изменено в версии 3.4: Больше не поднимает NotImplementedError при колле.

get_code(fullname)

Конкретная реализация InspectLoader.get_code().

exec_module(module)

Конкретная реализация Loader.exec_module().

Добавлено в версии 3.4.

load_module(fullname)

Конкретная реализация Loader.load_module().

Не рекомендуется, начиная с версии 3.4: Вместо этого используйте exec_module().

get_source(fullname)

Конкретная реализация InspectLoader.get_source().

is_package(fullname)

Конкретная реализация InspectLoader.is_package(). Модуль считается пакетом, если путь к его файлу (как указано в ExecutionLoader.get_filename()) представляет собой файл с именем __init__, если убрать расширение файла и само имя модуля не заканчивается на __init__.

class importlib.abc.Traversable

Объект с подмножеством методов pathlib.Path, подходящих для обхода каталогов и открытия файлов.

Добавлено в версии 3.9.

abstractmethod name()

Базовое имя этого объекта без каких-либо родительских ссылок.

abstractmethod iterdir()

Yield Traversable objects in self.

abstractmethod is_dir()

Возвращает True, если self является каталогом.

abstractmethod is_file()

Возвращает True, если self является файлом.

abstractmethod joinpath(child)

Возврат Обращаемый ребенок в self.

abstractmethod __truediv__(child)

Возврат Обращаемый ребенок в self.

abstractmethod open(mode='r', *args, **kwargs)

mode может быть „r“ или „rb“ для открытия в текстовом или двоичном виде. Возвращает хэндл, пригодный для чтения (аналогично pathlib.Path.open).

При открытии как текст, принимает параметры кодировки, подобные тем, которые принимает io.TextIOWrapper.

read_bytes()

Считать содержимое self в виде байтов.

read_text(encoding=None)

Прочитайте содержимое себя как текст.

class importlib.abc.TraversableResources

Абстрактный базовый класс для читателей ресурсов, способных обслуживать интерфейс files. Подклассы ResourceReader и обеспечивают конкретные реализации абстрактных методов ResourceReader. Поэтому любой загрузчик, поставляющий TraversableReader, также поставляет ResourceReader.

Загрузчики, которые хотят поддерживать чтение ресурсов, должны реализовать этот интерфейс.

Добавлено в версии 3.9.

importlib.resources – Ресурсы

Исходный код: Lib/importlib/resources.py.


Добавлено в версии 3.7.

Этот модуль использует систему импорта Python для предоставления доступа к ресурсам внутри пакетов. Если вы можете импортировать пакет, вы можете получить доступ к ресурсам внутри этого пакета. Ресурсы можно открывать или читать в двоичном или текстовом режиме.

Ресурсы примерно похожи на файлы внутри каталогов, хотя важно помнить, что это всего лишь метафора. Ресурсы и пакеты **не обязательно должны существовать как физические файлы и каталоги в файловой системе.

Примечание

Этот модуль предоставляет функциональность, аналогичную pkg_resources Basic Resource Access без накладных расходов на производительность этого пакета. Это упрощает чтение ресурсов, включенных в пакеты, с более стабильной и последовательной семантикой.

Автономный бэкпорт этого модуля предоставляет больше информации о using importlib.resources и migrating from pkg_resources to importlib.resources.

Загрузчики, которые хотят поддерживать чтение ресурсов, должны реализовать метод get_resource_reader(fullname), как указано в importlib.abc.ResourceReader.

Определены следующие типы.

importlib.resources.Package

Тип Package определяется как Union[str, ModuleType]. Это означает, что там, где функция описывает прием Package, вы можете передать либо строку, либо модуль. Объекты модуля должны иметь разрешимый __spec__.submodule_search_locations, который не является None.

importlib.resources.Resource

Этот тип описывает имена ресурсов, передаваемые в различные функции этого пакета. Он определяется как Union[str, os.PathLike].

Доступны следующие функции.

importlib.resources.files(package)

Возвращает объект importlib.resources.abc.Traversable, представляющий контейнер ресурсов для пакета (считай, каталог) и его ресурсы (считай, файлы). Traversable может содержать другие контейнеры (думаю, подкаталоги).

package - это либо имя, либо объект модуля, который соответствует требованиям Package.

Добавлено в версии 3.9.

importlib.resources.as_file(traversable)

Учитывая объект importlib.resources.abc.Traversable, представляющий файл, обычно из importlib.resources.files(), верните менеджер контекста для использования в операторе with. Менеджер контекста предоставляет объект pathlib.Path.

Выход из контекстного менеджера очищает любой временный файл, созданный при извлечении ресурса, например, из zip-файла.

Используйте as_file, когда методов Traversable (read_text и т.д.) недостаточно и требуется фактический файл в файловой системе.

Добавлено в версии 3.9.

importlib.resources.open_binary(package, resource)

Открыть для бинарного чтения ресурс внутри пакета.

package - это либо имя, либо объект модуля, который соответствует требованиям Package. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь вложенных ресурсов (т.е. не может быть каталогом). Эта функция возвращает экземпляр typing.BinaryIO, двоичный поток ввода-вывода, открытый для чтения.

importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict')

Открыть для чтения текста ресурс в пакете. По умолчанию ресурс открывается для чтения в формате UTF-8.

package - это либо имя, либо объект модуля, который соответствует требованиям Package. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь вложенных ресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и для встроенного open().

Эта функция возвращает экземпляр typing.TextIO, текстовый поток ввода/вывода, открытый для чтения.

importlib.resources.read_binary(package, resource)

Прочитать и вернуть содержимое resource внутри package в виде bytes.

package - это либо имя, либо объект модуля, который соответствует требованиям Package. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь подресурсов (т.е. не может быть каталогом). Эта функция возвращает содержимое ресурса в виде bytes.

importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict')

Считывает и возвращает содержимое resource в package в виде str. По умолчанию содержимое считывается в строгом формате UTF-8.

package - это либо имя, либо объект модуля, который соответствует требованиям Package. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь вложенных ресурсов (т.е. не может быть каталогом). encoding и errors имеют то же значение, что и для встроенной функции open(). Эта функция возвращает содержимое ресурса в виде str.

importlib.resources.path(package, resource)

Возвращает путь к ресурсу в виде фактического пути к файловой системе. Эта функция возвращает менеджер контекста для использования в операторе with. Менеджер контекста предоставляет объект pathlib.Path.

Выход из контекстного менеджера очищает любой временный файл, созданный, когда ресурс должен быть извлечен, например, из zip-файла.

package - это либо имя, либо объект модуля, который соответствует требованиям Package. resource - это имя ресурса, который нужно открыть в package; он не может содержать разделителей путей и не может иметь подресурсов (т.е. не может быть каталогом).

importlib.resources.is_resource(package, name)

Возвращает True, если в пакете есть ресурс с именем name, иначе False. Помните, что каталоги - это не ресурсы! package - это либо имя, либо объект модуля, который соответствует требованиям Package.

importlib.resources.contents(package)

Возвращает итерабельную выборку по именованным элементам в пакете. Итерабельность возвращает str ресурсов (например, файлов) и не-ресурсов (например, каталогов). Итерабельность не пересматривает подкаталоги.

package - это либо имя, либо объект модуля, который соответствует требованиям Package.

importlib.machinery – Импортеры и крючки путей

Исходный код: Lib/importlib/machinery.py.


Этот модуль содержит различные объекты, которые помогают import находить и загружать модули.

importlib.machinery.SOURCE_SUFFIXES

Список строк, представляющих распознанные суффиксы файлов для исходных модулей.

Добавлено в версии 3.3.

importlib.machinery.DEBUG_BYTECODE_SUFFIXES

Список строк, представляющих суффиксы файлов для неоптимизированных модулей байткода.

Добавлено в версии 3.3.

Не рекомендуется, начиная с версии 3.5: Вместо этого используйте BYTECODE_SUFFIXES.

importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

Список строк, представляющих суффиксы файлов для оптимизированных модулей байткода.

Добавлено в версии 3.3.

Не рекомендуется, начиная с версии 3.5: Вместо этого используйте BYTECODE_SUFFIXES.

importlib.machinery.BYTECODE_SUFFIXES

Список строк, представляющих распознанные суффиксы файлов для модулей байткода (включая ведущую точку).

Добавлено в версии 3.3.

Изменено в версии 3.5: Значение больше не зависит от __debug__.

importlib.machinery.EXTENSION_SUFFIXES

Список строк, представляющих распознанные суффиксы файлов для модулей расширения.

Добавлено в версии 3.3.

importlib.machinery.all_suffixes()

Возвращает объединенный список строк, представляющих все суффиксы файлов для модулей, распознаваемых стандартным механизмом импорта. Это помощник для кода, которому просто нужно знать, ссылается ли путь к файловой системе на модуль, не требуя подробностей о типе модуля (например, inspect.getmodulename()).

Добавлено в версии 3.3.

class importlib.machinery.BuiltinImporter

importer для встроенных модулей. Все известные встроенные модули перечислены в sys.builtin_module_names. Этот класс реализует importlib.abc.MetaPathFinder и importlib.abc.InspectLoader ABC.

Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.

Изменено в версии 3.5: Как часть PEP 489, встроенный импортер теперь реализует Loader.create_module() и Loader.exec_module().

class importlib.machinery.FrozenImporter

Класс importer для замороженных модулей. Этот класс реализует importlib.abc.MetaPathFinder и importlib.abc.InspectLoader ABCs.

Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.

Изменено в версии 3.4: Получил методы create_module() и exec_module().

class importlib.machinery.WindowsRegistryFinder

Finder для модулей, объявленных в реестре Windows. Этот класс реализует importlib.abc.MetaPathFinder ABC.

Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.

Добавлено в версии 3.3.

Не рекомендуется, начиная с версии 3.6: Вместо этого используйте конфигурацию site. Будущие версии Python могут не включать этот поисковик по умолчанию.

class importlib.machinery.PathFinder

Класс Finder для атрибутов sys.path и пакета __path__. Этот класс реализует importlib.abc.MetaPathFinder ABC.

Только методы класса определяются этим классом, чтобы облегчить необходимость инстанцирования.

classmethod find_spec(fullname, path=None, target=None)

Метод класса, который пытается найти spec для модуля, указанного fullname на sys.path или, если определено, на path. Для каждого элемента пути, по которому ведется поиск, проверяется sys.path_importer_cache. Если найден не ложный объект, то он используется в качестве path entry finder для поиска искомого модуля. Если запись в sys.path_importer_cache не найдена, то в sys.path_hooks ищется искатель для записи пути и, если он найден, сохраняется в sys.path_importer_cache вместе с запросом о модуле. Если искатель не найден, то None и сохраняется в кэше, и возвращается.

Добавлено в версии 3.4.

Изменено в версии 3.5: Если текущий рабочий каталог – представленный пустой строкой – больше не действителен, то возвращается None, но значение не кэшируется в sys.path_importer_cache.

classmethod find_module(fullname, path=None)

Унаследованная обертка вокруг find_spec().

Не рекомендуется, начиная с версии 3.4: Вместо этого используйте find_spec().

classmethod invalidate_caches()

Вызывает importlib.abc.PathEntryFinder.invalidate_caches() на всех искателях, хранящихся в sys.path_importer_cache, которые определяют метод. В противном случае записи в sys.path_importer_cache, установленные в None, удаляются.

Изменено в версии 3.7: Записи None в sys.path_importer_cache удаляются.

Изменено в версии 3.4: Вызывает объекты в sys.path_hooks с текущим рабочим каталогом для '' (т.е. пустая строка).

class importlib.machinery.FileFinder(path, *loader_details)

Конкретная реализация importlib.abc.PathEntryFinder, которая кэширует результаты из файловой системы.

Аргумент path - это каталог, поиск в котором выполняет программа finder.

Аргумент loader_details представляет собой переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность суффиксов файлов, которые распознает загрузчик. Ожидается, что загрузчики будут вызываемыми файлами, которые принимают два аргумента: имя модуля и путь к найденному файлу.

Программа поиска будет кэшировать содержимое каталога по мере необходимости, выполняя вызовы stat для каждого поиска модуля, чтобы убедиться, что кэш не устарел. Поскольку неизменность кэша зависит от детализации информации операционной системы о состоянии файловой системы, существует потенциальное состояние гонки: поиск модуля, создание нового файла, а затем поиск модуля, который представляет новый файл. Если эти операции выполняются достаточно быстро, чтобы уложиться в гранулярность вызовов stat, то поиск модуля завершится неудачей. Чтобы этого не произошло, при динамическом создании модуля обязательно вызывайте importlib.invalidate_caches().

Добавлено в версии 3.3.

path

Путь, по которому будет вестись поиск.

find_spec(fullname, target=None)

Попытка найти спецификацию для обработки fullname в пределах path.

Добавлено в версии 3.4.

find_loader(fullname)

Попытка найти загрузчик для обработки fullname в пределах path.

Не рекомендуется, начиная с версии 3.10: Вместо этого используйте find_spec().

invalidate_caches()

Очистите внутренний кэш.

classmethod path_hook(*loader_details)

Метод класса, который возвращает закрытие для использования на sys.path_hooks. Экземпляр FileFinder возвращается закрытием, используя аргумент path, переданный закрытию напрямую, и loader_details косвенно.

Если аргумент закрытия не является существующим каталогом, выдается сообщение ImportError.

class importlib.machinery.SourceFileLoader(fullname, path)

Конкретная реализация importlib.abc.SourceLoader путем подклассификации importlib.abc.FileLoader и предоставления некоторых конкретных реализаций других методов.

Добавлено в версии 3.3.

name

Имя модуля, который будет обрабатывать этот загрузчик.

path

Путь к исходному файлу.

is_package(fullname)

Верните True, если path окажется для пакета.

path_stats(path)

Конкретная реализация importlib.abc.SourceLoader.path_stats().

set_data(path, data)

Конкретная реализация importlib.abc.SourceLoader.set_data().

load_module(name=None)

Конкретная реализация importlib.abc.Loader.load_module(), где указание имени загружаемого модуля является необязательным.

Не рекомендуется, начиная с версии 3.6: Вместо этого используйте importlib.abc.Loader.exec_module().

class importlib.machinery.SourcelessFileLoader(fullname, path)

Конкретная реализация importlib.abc.FileLoader, которая может импортировать файлы байткода (т.е. файлы исходного кода отсутствуют).

Обратите внимание, что прямое использование файлов байткода (а не файлов исходного кода) препятствует использованию ваших модулей всеми реализациями Python или новыми версиями Python, которые изменяют формат байткода.

Добавлено в версии 3.3.

name

Имя модуля, с которым будет работать загрузчик.

path

Путь к файлу байткода.

is_package(fullname)

Определяет, является ли модуль пакетом на основе path.

get_code(fullname)

Возвращает объект кода для name, созданный из path.

get_source(fullname)

Возвращает None, так как файлы байткода не имеют источника при использовании этого загрузчика.

load_module(name=None)

Конкретная реализация importlib.abc.Loader.load_module(), где указание имени загружаемого модуля является необязательным.

Не рекомендуется, начиная с версии 3.6: Вместо этого используйте importlib.abc.Loader.exec_module().

class importlib.machinery.ExtensionFileLoader(fullname, path)

Конкретная реализация importlib.abc.ExecutionLoader для модулей расширения.

Аргумент fullname указывает имя модуля, который должен поддерживать загрузчик. Аргумент path - это путь к файлу модуля расширения.

Добавлено в версии 3.3.

name

Имя модуля, который поддерживает загрузчик.

path

Путь к модулю расширения.

create_module(spec)

Создает объект модуля из заданной спецификации в соответствии с PEP 489.

Добавлено в версии 3.5.

exec_module(module)

Инициализирует заданный объект модуля в соответствии с PEP 489.

Добавлено в версии 3.5.

is_package(fullname)

Возвращает True, если путь к файлу указывает на модуль пакета __init__, основанный на EXTENSION_SUFFIXES.

get_code(fullname)

Возвращает None, так как модули расширения не имеют объекта кода.

get_source(fullname)

Возвращает None, так как модули расширения не имеют исходного кода.

get_filename(fullname)

Возвращает path.

Добавлено в версии 3.4.

class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)

Спецификация для состояния модуля, связанного с системой импорта. Обычно она отображается как атрибут модуля __spec__. В приведенных ниже описаниях имена в круглых скобках указывают на соответствующий атрибут, доступный непосредственно на объекте модуля. Например, module.__spec__.origin == module.__file__. Обратите внимание, что хотя значения обычно эквивалентны, они могут отличаться, поскольку между двумя объектами нет синхронизации. Таким образом, можно обновить __path__ модуля во время выполнения, и это не будет автоматически отражено в __spec__.submodule_search_locations.

Добавлено в версии 3.4.

name

(__name__)

Строка для полного имени модуля.

loader

(__loader__)

Loader, который должен использоваться при загрузке модуля. Finders всегда должен устанавливать это значение.

origin

(__file__)

Имя места, из которого загружается модуль, например, «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно должно быть задано значение «origin», но оно может быть None (по умолчанию), что означает, что оно не определено (например, для пакетов пространства имен).

submodule_search_locations

(__path__)

Список строк для поиска подмодулей, если это пакет (None в противном случае).

loader_state

Контейнер дополнительных данных, специфичных для модуля, для использования во время загрузки (или None).

cached

(__cached__)

Строка для указания места хранения скомпилированного модуля (или None).

parent

(__package__)

(Только для чтения) Полное квалифицированное имя пакета, под которым модуль должен быть загружен как подмодуль (или пустая строка для модулей верхнего уровня). Для пакетов это то же самое, что и __name__.

has_location

Булево значение, указывающее, относится ли атрибут «origin» модуля к загружаемому местоположению или нет.

importlib.util – Код утилиты для импортеров

Исходный код: Lib/importlib/util.py.


Этот модуль содержит различные объекты, которые помогают в построении importer.

importlib.util.MAGIC_NUMBER

Байт, представляющий номер версии байткода. Если вам нужна помощь с загрузкой/записью байткода, рассмотрите вариант importlib.abc.SourceLoader.

Добавлено в версии 3.4.

importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)

Возвращает PEP 3147/PEP 488 путь к байт-компилированному файлу, связанному с исходным path. Например, если path - это /foo/bar/baz.py, возвращаемое значение будет /foo/bar/__pycache__/baz.cpython-32.pyc для Python 3.2. Строка cpython-32 берется из текущего магического тега (см. get_tag(); если sys.implementation.cache_tag не определен, то будет выдано NotImplementedError).

Параметр оптимизация используется для указания уровня оптимизации файла байткода. Пустая строка означает отсутствие оптимизации, поэтому /foo/bar/baz.py с оптимизацией '' приведет к пути байткода /foo/bar/__pycache__/baz.cpython-32.pyc. None вызывает использование уровня оптимизации интерпретатора. Строковое представление любого другого значения используется, поэтому /foo/bar/baz.py с оптимизацией 2 приведет к пути байткода /foo/bar/__pycache__/baz.cpython-32.opt-2.pyc. Строковое представление оптимизации может быть только буквенно-цифровым, в противном случае возникает ошибка ValueError.

Параметр debug_override является устаревшим и может использоваться для переопределения системного значения для __debug__. Значение True эквивалентно установке optimization в пустую строку. Значение False равнозначно установке оптимизации в 1. Если оба значения debug_override и optimization не равны None, то выдается сообщение TypeError.

Добавлено в версии 3.4.

Изменено в версии 3.5: Был добавлен параметр optimization, а параметр debug_override был устаревшим.

Изменено в версии 3.6: Принимает path-like object.

importlib.util.source_from_cache(path)

Учитывая путь к имени файла PEP 3147, возвращает путь к соответствующему файлу исходного кода. Например, если path - это /foo/bar/__pycache__/baz.cpython-32.pyc, то возвращаемый путь будет /foo/bar/baz.py. path не обязательно должен существовать, однако если он не соответствует формату PEP 3147 или PEP 488, будет выдано предупреждение ValueError. Если sys.implementation.cache_tag не определен, выдается сообщение NotImplementedError.

Добавлено в версии 3.4.

Изменено в версии 3.6: Принимает path-like object.

importlib.util.decode_source(source_bytes)

Декодирует заданные байты, представляющие исходный код, и возвращает их в виде строки с универсальными новыми строками (как того требует importlib.abc.InspectLoader.get_source()).

Добавлено в версии 3.4.

importlib.util.resolve_name(name, package)

Приведите относительное имя модуля к абсолютному.

Если name не содержит ведущих точек, то просто возвращается name. Это позволяет использовать, например, importlib.util.resolve_name('sys', __spec__.parent) без проверки, нужен ли аргумент package.

ImportError возникает, если name является относительным именем модуля, но package является ложным значением (например, None или пустой строкой). ImportError также будет вызвано, если относительное имя будет скрыто от содержащего его пакета (например, запрос ..bacon из пакета spam).

Добавлено в версии 3.3.

Изменено в версии 3.9: Чтобы улучшить согласованность с операторами импорта, при попытках некорректного относительного импорта вместо ImportError выдавайте ValueError.

importlib.util.find_spec(name, package=None)

Находит spec для модуля, опционально относительно указанного имени пакета. Если модуль находится в sys.modules, то возвращается sys.modules[name].__spec__ (если только спецификация не будет None или не установлена, в этом случае выдается ValueError). В противном случае выполняется поиск с использованием sys.meta_path. Если спецификация не найдена, возвращается None.

Если name относится к подмодулю (содержит точку), то родительский модуль импортируется автоматически.

name и package работают так же, как и для import_module().

Добавлено в версии 3.4.

Изменено в версии 3.7: Вызывает ModuleNotFoundError вместо AttributeError, если package на самом деле не является пакетом (т.е. не имеет атрибута __path__).

importlib.util.module_from_spec(spec)

Создайте новый модуль на основе spec и spec.loader.create_module.

Если spec.loader.create_module не возвращает None, то любые ранее существовавшие атрибуты не будут сброшены. Также не будет выдано AttributeError, если оно сработает при обращении к spec или установке атрибута модуля.

Эта функция предпочтительнее, чем использование types.ModuleType для создания нового модуля, поскольку spec используется для установки как можно большего количества контролируемых импортом атрибутов модуля.

Добавлено в версии 3.5.

@importlib.util.module_for_loader

decorator для importlib.abc.Loader.load_module() для обработки выбора соответствующего объекта модуля для загрузки. Ожидается, что декорированный метод будет иметь сигнатуру вызова, принимающую два позиционных аргумента (например, load_module(self, module)), для которых второй аргумент будет модульным объектом, который будет использоваться загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами из-за предположения о двух аргументах.

Украшенный метод принимает имя модуля, который должен быть загружен, как ожидается для loader. Если модуль не найден в sys.modules, то создается новый. Независимо от того, откуда пришел модуль, __loader__ устанавливается в self, а __package__ устанавливается на основе того, что возвращает importlib.abc.InspectLoader.is_package() (если доступно). Эти атрибуты устанавливаются безусловно для поддержки перезагрузки.

Если метод decorated вызывает исключение и модуль был добавлен в sys.modules, то модуль будет удален, чтобы предотвратить попадание частично инициализированного модуля в sys.modules. Если модуль уже был в sys.modules, то он будет оставлен в покое.

Изменено в версии 3.3: __loader__ и __package__ устанавливаются автоматически (когда это возможно).

Изменено в версии 3.4: Установите __name__, __loader__ __package__ безусловно для поддержки перезагрузки.

Не рекомендуется, начиная с версии 3.4: Теперь механизм импорта напрямую выполняет все функции, предоставляемые этой функцией.

@importlib.util.set_loader

Декоратор decorator для importlib.abc.Loader.load_module(), чтобы установить атрибут __loader__ на возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обернутого метода (т.е. self) - это то, что должно быть установлено в __loader__.

Изменено в версии 3.4: Установите __loader__, если установлено None, как если бы атрибут не существовал.

Не рекомендуется, начиная с версии 3.4: Механизм импорта позаботится об этом автоматически.

@importlib.util.set_package

decorator для importlib.abc.Loader.load_module(), чтобы установить атрибут __package__ на возвращаемом модуле. Если __package__ установлен и имеет значение, отличное от None, он не будет изменен.

Не рекомендуется, начиная с версии 3.4: Механизм импорта позаботится об этом автоматически.

importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)

Фабричная функция для создания экземпляра ModuleSpec на основе загрузчика. Параметры имеют то же значение, что и для ModuleSpec. Функция использует доступные API loader, такие как InspectLoader.is_package(), для заполнения недостающей информации о спецификации.

Добавлено в версии 3.4.

importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)

Фабричная функция для создания экземпляра ModuleSpec на основе пути к файлу. Недостающая информация будет заполнена в спецификации за счет использования API загрузчика и подразумевания того, что модуль будет основан на файлах.

Добавлено в версии 3.4.

Изменено в версии 3.6: Принимает path-like object.

importlib.util.source_hash(source_bytes)

Возвращает хэш source_bytes в виде байтов. Основанный на хэше .pyc файл встраивает source_hash() содержимое соответствующего исходного файла в свой заголовок.

Добавлено в версии 3.7.

class importlib.util.LazyLoader(loader)

Класс, который откладывает выполнение загрузчика модуля до тех пор, пока модуль не получит доступ к какому-либо атрибуту.

Этот класс единственно работает с загрузчиками, определяющими exec_module(), поскольку требуется контроль над тем, какой тип модуля используется для модуля. По тем же причинам метод загрузчика create_module() должен возвращать None или тип, для которого его атрибут __class__ может быть изменен, а также не использовать slots. Наконец, модули, которые подменяют объект, помещенный в sys.modules, не будут работать, так как нет способа правильно заменить ссылки на модуль во всем интерпретаторе безопасным образом; ValueError будет поднята тревога, если такая подмена будет обнаружена.

Примечание

Для проектов, где время запуска критично, этот класс позволяет потенциально минимизировать затраты на загрузку модуля, если он никогда не используется. Для проектов, где время запуска не является критичным, использование этого класса очень не рекомендуется из-за того, что сообщения об ошибках, созданные во время загрузки, будут отложены и, таким образом, появятся вне контекста.

Добавлено в версии 3.5.

Изменено в версии 3.6: Начал вызывать create_module(), убрав предупреждение о совместимости для importlib.machinery.BuiltinImporter и importlib.machinery.ExtensionFileLoader.

classmethod factory(loader)

Статический метод, который возвращает вызываемый объект, создающий ленивый загрузчик. Он предназначен для использования в ситуациях, когда загрузчик передается по классу, а не по экземпляру.

suffixes = importlib.machinery.SOURCE_SUFFIXES
loader = importlib.machinery.SourceFileLoader
lazy_loader = importlib.util.LazyLoader.factory(loader)
finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))

Примеры

Импортирование программным способом

Чтобы программно импортировать модуль, используйте importlib.import_module().

import importlib

itertools = importlib.import_module('itertools')

Проверка возможности импорта модуля

Если вам нужно узнать, можно ли импортировать модуль, не выполняя импорта, используйте importlib.util.find_spec().

Обратите внимание, что если name является подмодулем (содержит точку), importlib.util.find_spec() будет импортировать родительский модуль.

import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you chose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

Импорт исходного файла напрямую

Чтобы импортировать исходный файл Python напрямую, используйте следующий рецепт (только для Python 3.5 и новее):

import importlib.util
import sys

# For illustrative purposes.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)

Реализация ленивого импорта

В примере ниже показано, как реализовать ленивый импорт:

>>> import importlib.util
>>> import sys
>>> def lazy_import(name):
...     spec = importlib.util.find_spec(name)
...     loader = importlib.util.LazyLoader(spec.loader)
...     spec.loader = loader
...     module = importlib.util.module_from_spec(spec)
...     sys.modules[name] = module
...     loader.exec_module(module)
...     return module
...
>>> lazy_typing = lazy_import("typing")
>>> #lazy_typing is a real module object,
>>> #but it is not loaded in memory yet.
>>> lazy_typing.TYPE_CHECKING
False

Настройка импортера

Для глубокой настройки импорта вы обычно хотите реализовать importer. Это означает управление как finder, так и loader. Для искателей есть два варианта в зависимости от ваших потребностей: meta path finder или path entry finder. Первый - это то, что вы поместите на sys.meta_path, а второй - то, что вы создадите с помощью path entry hook на sys.path_hooks, который работает с записями sys.path для потенциального создания искателя. Этот пример покажет вам, как зарегистрировать ваши собственные импортеры, чтобы import использовал их (для создания собственного импортера читайте документацию для соответствующих классов, определенных в этом пакете):

import importlib.machinery
import sys

# For illustrative purposes only.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
                  importlib.machinery.SOURCE_SUFFIXES)

# Setting up a meta path finder.
# Make sure to put the finder in the proper location in the list in terms of
# priority.
sys.meta_path.append(SpamMetaPathFinder)

# Setting up a path entry finder.
# Make sure to put the path hook in the proper location in the list in terms
# of priority.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))

Приближение importlib.import_module()

Сам импорт реализован в коде Python, что позволяет раскрыть большинство механизмов импорта через importlib. Приведенное ниже описание помогает проиллюстрировать различные API, которые раскрывает importlib, предоставляя примерную реализацию importlib.import_module() (Python 3.4 и новее для использования importlib, Python 3.6 и новее для других частей кода).

import importlib.util
import sys

def import_module(name, package=None):
    """An approximate implementation of import."""
    absolute_name = importlib.util.resolve_name(name, package)
    try:
        return sys.modules[absolute_name]
    except KeyError:
        pass

    path = None
    if '.' in absolute_name:
        parent_name, _, child_name = absolute_name.rpartition('.')
        parent_module = import_module(parent_name)
        path = parent_module.__spec__.submodule_search_locations
    for finder in sys.meta_path:
        spec = finder.find_spec(absolute_name, path)
        if spec is not None:
            break
    else:
        msg = f'No module named {absolute_name!r}'
        raise ModuleNotFoundError(msg, name=absolute_name)
    module = importlib.util.module_from_spec(spec)
    sys.modules[absolute_name] = module
    spec.loader.exec_module(module)
    if path is not None:
        setattr(parent_module, child_name, module)
    return module
Вернуться на верх