Модуль importlib.util
содержит различные объекты, которые помогают в создании объекта, который находит и загружает модуль.
importlib.util.MAGIC_NUMBER
,importlib.util.cache_from_source
,importlib.util.source_from_cache
,importlib.util.decode_source
,importlib.util.resolve_name
,importlib.util.find_spec
,importlib.util.module_from_spec
,@importlib.util.module_for_loader
,@importlib.util.set_loader
,@importlib.util.set_package
,importlib.util.spec_from_loader
,importlib.util.spec_from_file_location
,importlib.util.source_hash
,importlib.util.LazyLoader
.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))