Сообщить об ошибке.

Модуль importlib.util в Python

Утилиты поиска и загрузки модуля

Модуль importlib.util содержит различные объекты, которые помогают в создании объекта, который находит и загружает модуль.

Содержание:


importlib.util.MAGIC_NUMBER:

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

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

Функция importlib.util.cache_from_source() возвращает путь к байт-компилированному файлу, связанному с исходным путем path. Например, если путь /foo/bar/baz.py возвращаемое значение будет именем /foo/bar/__pycache__/baz.cpython-38.pyc для Python 3.8. Если sys.implementation.cache_tag не определено, то будет брошено исключение NotImplementedError.

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

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

importlib.util.source_from_cache(path):

Функция importlib.util.source_from_cache() вернет путь к соответствующему файлу исходного кода, если указан путь path к имени файла. Например, если путь равен /foo/bar/__pycache__/baz.cpython-38.pyc, возвращаемый путь будет /foo/bar/baz.py. Если path не соответствует формату PEP 3147 или PEP 488, возникает ошибка ValueError. Если sys.implementation.cache_tag не определено, вызывается исключение NotImplementedError.

importlib.util.decode_source(source_bytes):

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

importlib.util.resolve_name(name, package):

Функция importlib.util.resolve_name преобразовывает относительное имя name модуля в абсолютное.

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

Установка __package__ в модуле устарела и перестанет устанавливаться или приниматься во внимание системой импорта в Python 3.14.

Если name является относительным именем модуля, а package является ложным значением, например None или пустой строкой, то вызывается исключение ImportError. Это исключение так же вызывается если относительное имя name не будет выходить в пакет package, например запрашивать ..bacon из пакета spam.

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

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

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

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

Аргументы name и package работают так же, как и для importlib.import_module().

importlib.util.module_from_spec(spec):

Функция importlib.util.module_from_spec создает новый модуль на основе spec и spec.loader.create_module.

Если spec.loader.create_module не возвращает None, то любые ранее существующие атрибуты не будут сброшены. Кроме того, никакой AttributeError не будет вызван, если вызван, обращаясь к спецификации или устанавливая атрибут в модуле.

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

@importlib.util.module_for_loader:

Декоратор @importlib.util.module_for_loader устарел, начиная с версии Python-3.4: система импорта теперь непосредственно выполняет все функциональные возможности, предоставляемые этой функцией.

@importlib.util.set_loader:

Декоратор @importlib.util.set_loader устарел, начиная с версии Python-3.4: система импорта позаботится об этом автоматически.

@importlib.util.set_package:

Декоратор @importlib.util.set_package устарел, начиная с версии Python-3.4: система импорта позаботится об этом автоматически.

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

Фабричная функция importlib.util.spec_from_loader предназначена для создания экземпляра importlib.machinery.ModuleSpec() на основе загрузчика. Параметры имеют то же значение, что и для importlib.machinery.ModuleSpec.

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

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

Фабричная функция importlib.util.spec_from_file_location предназначена для создания экземпляра importlib.machinery.ModuleSpec() на основе пути к файлу.

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

importlib.util.source_hash(source_bytes):

Функция importlib.util.source_hash вернет хеш source_bytes как строку байтов. Файл .pyc встраивает полученный хеш соответствующего исходного файла в свой заголовок.

importlib.util.LazyLoader(loader):

Класс importlib.util.LazyLoader() откладывает выполнение загрузчика модуля до тех пор, пока модуль не получит доступ к атрибуту.

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

Наконец, модули, которые заменяют объект, помещенный в sys.module, не будут работать, так как нет способа безопасно и правильно заменить ссылки на модули в интерпретаторе. если такая замена обнаружена, то вызывается исключение ValueError.

Примечание.

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

Метод класса:

  • 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))