Документация Python неофициальный перевод

importlib.md

322 строк · 37.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/importlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 29.6. [`importlib`](https://python-all.ru/3.2/library/importlib.html#module-importlib) – реализация [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import)89Новое в версии 3.1.1011## 29.6.1. Введение1213Цель пакета [`importlib`](https://python-all.ru/3.2/library/importlib.html#module-importlib) двояка. Во-первых, предоставить реализацию инструкции [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import) (и, соответственно, функции [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__)) в исходном коде Python. Это даёт реализацию [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import), переносимую на любой интерпретатор Python. Также это предоставляет эталонную реализацию, которую проще понять, чем реализацию на другом языке программирования.1415Во-вторых, компоненты для реализации [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import) доступны в этом пакете, что упрощает создание пользовательских объектов (в общем случае называемых [*импортёром*](https://python-all.ru/3.2/glossary.html#term-importer)) для участия в процессе импорта. Подробности о пользовательских импортёрах можно найти в [**PEP 302**](https://python-all.ru/3.2/library/importlib.html).1617> **См. также**18>19> **[*Оператор import*](https://python-all.ru/3.2/reference/simple_stmts.html#import)**20>21> Справочное руководство по оператору22>23> [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import)24>25> .26>27> **[Спецификация пакетов](https://python-all.ru/3.2/library/importlib.html)**28>29> Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе30>31> `None`32>33> в34>35> [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules)36>37> ).38>39> **Функция [`__import__()`](https://python-all.ru/3.2/library/importlib.html#importlib.__import__)**40>41> Оператор42>43> [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import)44>45> – это синтаксический сахар для этой функции.46>47> **[**PEP 235**](https://python-all.ru/3.2/library/importlib.html)**48>49> Импорт на платформах, нечувствительных к регистру50>51> **[**PEP 263**](https://python-all.ru/3.2/library/importlib.html)**52>53> Определение кодировок исходного кода Python54>55> **[**PEP 302**](https://python-all.ru/3.2/library/importlib.html)**56>57> Новые хуки импорта58>59> **[**PEP 328**](https://python-all.ru/3.2/library/importlib.html)**60>61> Импорт: многострочный и абсолютный/относительный62>63> **[**PEP 366**](https://python-all.ru/3.2/library/importlib.html)**64>65> Явные относительные импорты в главном модуле66>67> **[**PEP 3120**](https://python-all.ru/3.2/library/importlib.html)**68>69> Использование UTF-8 в качестве кодировки исходного кода по умолчанию70>71> **[**PEP 3147**](https://python-all.ru/3.2/library/importlib.html)**72>73> Каталоги репозитория PYC7475## 29.6.2. Функции7677#### `importlib.__import__(name, globals={}, locals={}, fromlist=list(), level=0)`7879Реализация встроенной функции [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__).8081#### `importlib.import_module(name, package=None)`8283Импортирует модуль. Аргумент *name* задаёт импортируемый модуль в абсолютном или относительном виде (например, `pkg.mod` или `..mod`). Если имя указано в относительной форме, то аргумент *package* должен быть задан как имя пакета, который будет служить точкой привязки для разрешения имени пакета (например, `import_module('..mod', 'pkg.subpkg')` импортирует `pkg.mod`).8485Функция [`import_module()`](https://python-all.ru/3.2/library/importlib.html#importlib.import_module) действует как упрощающая обёртка вокруг [`importlib.__import__()`](https://python-all.ru/3.2/library/importlib.html#importlib.__import__). Это означает, что вся семантика функции выводится из [`importlib.__import__()`](https://python-all.ru/3.2/library/importlib.html#importlib.__import__), включая требование, чтобы пакет, из которого происходит импорт, был ранее импортирован (т.е. *package* должен быть уже импортирован). Самое важное отличие в том, что [`import_module()`](https://python-all.ru/3.2/library/importlib.html#importlib.import_module) возвращает самый вложенный пакет или модуль, который был импортирован (например, `pkg.mod`), в то время как [`__import__()`](https://python-all.ru/3.2/library/functions.html#__import__) возвращает пакет или модуль верхнего уровня (например, `pkg`).8687## 29.6.3. [`importlib.abc`](https://python-all.ru/3.2/library/importlib.html#module-importlib.abc) – Абстрактные базовые классы, связанные с импортом8889Модуль [`importlib.abc`](https://python-all.ru/3.2/library/importlib.html#module-importlib.abc) содержит все основные абстрактные базовые классы, используемые [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import). Также предоставляются некоторые подклассы основных абстрактных базовых классов для помощи в реализации базовых ABC.9091#### `class importlib.abc.Finder`9293Абстрактный базовый класс, представляющий [*искатель*](https://python-all.ru/3.2/glossary.html#term-finder). См. [**PEP 302**](https://python-all.ru/3.2/library/importlib.html) для точного определения искателя.9495#### `find_module(fullname, path=None)`9697Абстрактный метод для поиска [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader) для указанного модуля. Если [*искатель*](https://python-all.ru/3.2/glossary.html#term-finder) найден в [`sys.meta_path`](https://python-all.ru/3.2/library/sys.html#sys.meta_path) и искомый модуль является подпакетом или модулем, то *path* будет значением `__path__` из родительского пакета. Если загрузчик не найден, возвращается `None`.9899#### `class importlib.abc.Loader`100101Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader). См. [**PEP 302**](https://python-all.ru/3.2/library/importlib.html) для точного определения загрузчика.102103#### `load_module(fullname)`104105Абстрактный метод для загрузки модуля. Если модуль невозможно загрузить, возбуждается [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError), иначе возвращается загруженный модуль.106107Если запрошенный модуль уже существует в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules), то он должен быть использован и перезагружен. В противном случае загрузчик должен создать новый модуль и вставить его в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules) до начала загрузки, чтобы предотвратить рекурсию при импорте. Если загрузчик вставил модуль, но загрузка завершилась неудачей, он должен удалить его из [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules); модули, уже находившиеся в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules) до начала выполнения загрузчика, следует оставить нетронутыми. Декоратор [`importlib.util.module_for_loader()`](https://python-all.ru/3.2/library/importlib.html#importlib.util.module_for_loader) обрабатывает все эти детали.108109Загрузчик должен установить несколько атрибутов модуля. (Обратите внимание, что некоторые из этих атрибутов могут измениться при перезагрузке модуля.)110111- **`__name__`**112113  Имя модуля.114- **`__file__`**115116  Путь к месту хранения данных модуля (не задан для встроенных модулей).117- **`__path__`**118119  Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.120- **`__package__`**121122  Родительский пакет для модуля/пакета. Если модуль находится на верхнем уровне, то его значением является пустая строка. Декоратор [`importlib.util.set_package()`](https://python-all.ru/3.2/library/importlib.html#importlib.util.set_package) может обработать детали для `__package__`.123- **`__loader__`**124125  Загрузчик, используемый для загрузки модуля. (Он не устанавливается встроенным механизмом импорта, но должен быть установлен при использовании [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader).)126127#### `class importlib.abc.ResourceLoader`128129Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.2/library/importlib.html) для загрузки произвольных ресурсов из бэкенда хранилища.130131#### `get_data(path)`132133Абстрактный метод, возвращающий байты данных по заданному пути *path*. Загрузчики, имеющие файлоподобное хранилище, позволяющее сохранять произвольные данные, могут реализовать этот абстрактный метод для прямого доступа к хранимым данным. [`IOError`](https://python-all.ru/3.2/library/exceptions.html#IOError) должно быть возбуждено, если *path* не найден. Ожидается, что *path* будет построен с использованием атрибута модуля `__file__` или элемента из `__path__` пакета.134135#### `class importlib.abc.InspectLoader`136137Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.2/library/importlib.html) для загрузчиков, которые инспектируют модули.138139#### `get_code(fullname)`140141Абстрактный метод, возвращающий объект [`кода`](https://python-all.ru/3.2/library/code.html#module-code) для модуля. `None` возвращается, если модуль не имеет объекта кода (например, встроенный модуль). [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError) возбуждается, если загрузчик не может найти запрошенный модуль.142143#### `get_source(fullname)`144145Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием [*универсальных символов новой строки*](https://python-all.ru/3.2/glossary.html#term-universal-newlines), преобразуя все распознаваемые разделители строк в символы `'\n'`. Возвращает `None`, если исходный код недоступен (например, для встроенного модуля). Вызывает [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError), если загрузчик не может найти указанный модуль.146147#### `is_package(fullname)`148149Абстрактный метод, возвращающий истинное значение, если модуль является пакетом, и ложное в противном случае. [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError) возбуждается, если [*загрузчик*](https://python-all.ru/3.2/glossary.html#term-loader) не может найти модуль.150151#### `class importlib.abc.ExecutionLoader`152153Абстрактный базовый класс, наследующий от [`InspectLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader), который при реализации помогает выполнять модуль как скрипт. Этот ABC представляет необязательный протокол [**PEP 302**](https://python-all.ru/3.2/library/importlib.html).154155#### `get_filename(fullname)`156157Абстрактный метод, возвращающий значение `__file__` для указанного модуля. Если путь недоступен, возбуждается [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError).158159Если исходный код доступен, метод должен возвращать путь к файлу исходного кода, независимо от того, использовался ли байткод для загрузки модуля.160161#### `class importlib.abc.SourceLoader`162163Абстрактный базовый класс для реализации загрузки исходных (и, опционально, байт-кодовых) файлов. Этот класс наследует как от [`ResourceLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ResourceLoader), так и от [`ExecutionLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ExecutionLoader), требуя реализации следующих методов:164165- [`ResourceLoader.get_data()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ResourceLoader.get_data)166- **[`ExecutionLoader.get_filename()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)**167168  Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.169170Абстрактные методы, определённые в этом классе, предназначены для добавления необязательной поддержки файлов байткода. Если не реализовывать эти необязательные методы, загрузчик сможет работать только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода *и* байткода; но он не поддерживает *загрузку без исходного кода*, когда предоставляется только байткод. Файлы байткода являются оптимизацией, ускоряющей загрузку за счёт исключения этапа разбора компилятором Python, и поэтому никакой специфичный для байткода API не предоставляется.171172#### `path_mtime(self, path)`173174Необязательный абстрактный метод, возвращающий время изменения указанного пути.175176#### `set_data(self, path, data)`177178Необязательный абстрактный метод, записывающий указанные байты в файл по заданному пути. Все недостающие промежуточные каталоги должны быть созданы автоматически.179180Если запись по пути не удаётся, потому что путь доступен только для чтения ([`errno.EACCES`](https://python-all.ru/3.2/library/errno.html#errno.EACCES)), не распространяйте исключение.181182#### `get_code(self, fullname)`183184Конкретная реализация метода [`InspectLoader.get_code()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader.get_code).185186#### `load_module(self, fullname)`187188Конкретная реализация метода [`Loader.load_module()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.Loader.load_module).189190#### `get_source(self, fullname)`191192Конкретная реализация метода [`InspectLoader.get_source()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader.get_source).193194#### `is_package(self, fullname)`195196Конкретная реализация [`InspectLoader.is_package()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader.is_package). Модуль считается пакетом, если его путь – это файл с именем `__init__` после удаления расширения файла.197198#### `class importlib.abc.PyLoader`199200Абстрактный базовый класс, наследующий от [`ExecutionLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ExecutionLoader) и [`ResourceLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ResourceLoader), предназначенный для упрощения загрузки модулей на Python (байткод не обрабатывается; см. [`SourceLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.SourceLoader) для ABC исходного кода/байткода). Подкласс, реализующий этот ABC, должен заботиться только о том, как хранится исходный код; все остальные детали загрузки исходного кода Python будут обрабатываться конкретными реализациями ключевых методов.201202Устарело с версии 3.2: Этот класс устарел в пользу [`SourceLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.SourceLoader) и будет удалён в Python 3.4. Смотрите ниже, как создать подкласс, совместимый с Python 3.1 и новее.203204Если требуется совместимость с Python 3.1, используйте следующий подход для реализации подкласса, который будет работать с Python 3.1 и выше (обязательно реализуйте [`ExecutionLoader.get_filename()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)):205206```python207try:208    from importlib.abc import SourceLoader209except ImportError:210    from importlib.abc import PyLoader as SourceLoader211212class CustomLoader(SourceLoader):213    def get_filename(self, fullname):214        """Возвращает путь к исходному файлу."""215        # Реализует ...216217    def source_path(self, fullname):218        """Реализует source_path с помощью get_filename."""219        try:220            return self.get_filename(fullname)221        except ImportError:222            return None223224    def is_package(self, fullname):225        """Реализовать is_package путём поиска файла __init__226        имя, возвращаемое get_filename."""227        filename = os.path.basename(self.get_filename(fullname))228        return os.path.splitext(filename)[0] == '__init__'229```230231#### `source_path(fullname)`232233Абстрактный метод, возвращающий путь к исходному коду модуля. Должен возвращать `None`, если исходного кода нет. Возбуждает [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError), если загрузчик знает, что не может обработать модуль.234235#### `get_filename(fullname)`236237Конкретная реализация [`importlib.abc.ExecutionLoader.get_filename()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ExecutionLoader.get_filename), которая опирается на [`source_path()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader.source_path). Если [`source_path()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader.source_path) возвращает `None`, то возбуждается [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError).238239#### `load_module(fullname)`240241Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.Loader.load_module), которая загружает исходный код Python. Вся необходимая информация поступает из абстрактных методов, требуемых этим ABC. Единственное существенное предположение, которое делает этот метод, заключается в том, что при загрузке пакета `__path__` устанавливается в `[os.path.dirname(__file__)]`.242243#### `get_code(fullname)`244245Конкретная реализация [`importlib.abc.InspectLoader.get_code()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader.get_code), которая создаёт объекты кода из исходного кода Python, запрашивая исходный код (с помощью [`source_path()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader.source_path) и `get_data()`) и компилируя его с помощью встроенной функции [`compile()`](https://python-all.ru/3.2/library/functions.html#compile).246247#### `get_source(fullname)`248249Конкретная реализация [`importlib.abc.InspectLoader.get_source()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader.get_source). Использует [`importlib.abc.ResourceLoader.get_data()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ResourceLoader.get_data) и [`source_path()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader.source_path) для получения исходного кода. Он пытается угадать кодировку исходного кода с помощью [`tokenize.detect_encoding()`](https://python-all.ru/3.2/library/tokenize.html#tokenize.detect_encoding).250251#### `class importlib.abc.PyPycLoader`252253Абстрактный базовый класс, наследующий от [`PyLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader). Этот ABC предназначен для помощи в создании загрузчиков, поддерживающих как исходный код Python, так и байткод.254255Устарело с версии 3.2: Этот класс устарел в пользу [`SourceLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.SourceLoader) и для правильной поддержки [**PEP 3147**](https://python-all.ru/3.2/library/importlib.html). Если требуется совместимость с Python 3.1, реализуйте одновременно [`SourceLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.SourceLoader) и [`PyLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader); инструкции по этому поводу приведены в документации [`PyLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader). Обратите внимание, что это решение не поддерживает загрузку без исходного кода (только байт-код); поддерживается только загрузка исходного кода *и* байт-кода.256257#### `source_mtime(fullname)`258259Абстрактный метод, который возвращает время изменения исходного кода указанного модуля. Время изменения должно быть целым числом. Если исходного кода нет, вернуть `None`. Если модуль не найден, возбуждается [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError).260261#### `bytecode_path(fullname)`262263Абстрактный метод, который возвращает путь к байткоду указанного модуля, если он существует. Возвращает `None`, если байткода (пока) нет. Возбуждает [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError), если загрузчик знает, что не может обработать модуль.264265#### `get_filename(fullname)`266267A concrete implementation of [`ExecutionLoader.get_filename()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.ExecutionLoader.get_filename) that relies on [`PyLoader.source_path()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyLoader.source_path) and [`bytecode_path()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyPycLoader.bytecode_path). If `source_path()` returns a path, then that value is returned. Else if [`bytecode_path()`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.PyPycLoader.bytecode_path) returns a path, that path will be returned. If a path is not available from both methods, [`ImportError`](https://python-all.ru/3.2/library/exceptions.html#ImportError) is raised.268269#### `write_bytecode(fullname, bytecode)`270271An abstract method which has the loader write *bytecode* for future use. If the bytecode is written, return `True`. Return `False` if the bytecode could not be written. This method should not be called if [`sys.dont_write_bytecode`](https://python-all.ru/3.2/library/sys.html#sys.dont_write_bytecode) is true. The *bytecode* argument should be a bytes string or bytes array.272273## 29.6.4. [`importlib.machinery`](https://python-all.ru/3.2/library/importlib.html#module-importlib.machinery) – Импортёры и хуки путей274275Этот модуль содержит различные объекты, которые помогают [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import) находить и загружать модули.276277#### `class importlib.machinery.BuiltinImporter`278279An [*importer*](https://python-all.ru/3.2/glossary.html#term-importer) for built-in modules. All known built-in modules are listed in [`sys.builtin_module_names`](https://python-all.ru/3.2/library/sys.html#sys.builtin_module_names). This class implements the [`importlib.abc.Finder`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.Finder) and [`importlib.abc.InspectLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader) ABCs.280281В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.282283#### `class importlib.machinery.FrozenImporter`284285An [*importer*](https://python-all.ru/3.2/glossary.html#term-importer) for frozen modules. This class implements the [`importlib.abc.Finder`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.Finder) and [`importlib.abc.InspectLoader`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.InspectLoader) ABCs.286287В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.288289#### `class importlib.machinery.PathFinder`290291[*Finder*](https://python-all.ru/3.2/glossary.html#term-finder) для [`sys.path`](https://python-all.ru/3.2/library/sys.html#sys.path). Этот класс реализует [`importlib.abc.Finder`](https://python-all.ru/3.2/library/importlib.html#importlib.abc.Finder) ABC.292293Этот класс не полностью отражает семантику [`import`](https://python-all.ru/3.2/reference/simple_stmts.html#import) в отношении [`sys.path`](https://python-all.ru/3.2/library/sys.html#sys.path). Не предполагается никаких неявных хуков путей для упрощения класса и его семантики.294295В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.296297#### `classmethod find_module(fullname, path=None)`298299Метод класса, который пытается найти [*загрузчик*](https://python-all.ru/3.2/glossary.html#term-loader) для модуля, указанного в *fullname*, в [`sys.path`](https://python-all.ru/3.2/library/sys.html#sys.path) или, если задан, в *path*. Для каждой записи пути, которая просматривается, [`sys.path_importer_cache`](https://python-all.ru/3.2/library/sys.html#sys.path_importer_cache) проверяется. Если найден неложный объект, то он используется как [*finder*](https://python-all.ru/3.2/glossary.html#term-finder) для поиска модуля, который ищется. Если в [`sys.path_importer_cache`](https://python-all.ru/3.2/library/sys.html#sys.path_importer_cache) ничего не найдено, то [`sys.path_hooks`](https://python-all.ru/3.2/library/sys.html#sys.path_hooks) ищется на предмет finder для записи пути и, если найден, сохраняется в [`sys.path_importer_cache`](https://python-all.ru/3.2/library/sys.html#sys.path_importer_cache), а также выполняется запрос относительно модуля. Если ни один finder не найден, возвращается `None`.300301## 29.6.5. [`importlib.util`](https://python-all.ru/3.2/library/importlib.html#module-importlib.util) – Вспомогательный код для импортёров302303Этот модуль содержит различные объекты, помогающие в создании [*импортёра*](https://python-all.ru/3.2/glossary.html#term-importer).304305#### `@importlib.util.module_for_loader`306307[*Декоратор*](https://python-all.ru/3.2/glossary.html#term-decorator) для метода [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader), чтобы выбрать подходящий объект модуля для загрузки. Декорированный метод должен иметь сигнатуру вызова с двумя позиционными аргументами (например, `load_module(self, module)`), где второй аргумент будет **объектом** модуля, который будет использоваться загрузчиком. Обратите внимание: декоратор не будет работать со статическими методами, так как предполагается два аргумента.308309Декорированный метод будет принимать **имя** модуля для загрузки, как и ожидается для [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader). Если модуль не найден в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules), то создаётся новый с установленным атрибутом `__name__`. В противном случае модуль, найденный в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules), будет передан в метод. Если декорированный метод вызывает исключение и модуль был добавлен в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules), он будет удалён, чтобы не оставлять частично инициализированный модуль в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules). Если модуль уже был в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules), он остаётся нетронутым.310311Использование этого декоратора обрабатывает все детали того, какой объект модуля должен инициализировать загрузчик, как указано в [**PEP 302**](https://python-all.ru/3.2/library/importlib.html).312313#### `@importlib.util.set_loader`314315[*Декоратор*](https://python-all.ru/3.2/glossary.html#term-decorator) для метода [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader), который устанавливает атрибут `__loader__` на загруженных модулях. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обёрнутого метода – это то, на что должен быть установлен `__loader__`.316317#### `@importlib.util.set_package`318319Декоратор [*декоратор*](https://python-all.ru/3.2/glossary.html#term-decorator) для [*загрузчика*](https://python-all.ru/3.2/glossary.html#term-loader), устанавливающий атрибут `__package__` на модуле, возвращаемом загрузчиком. Если `__package__` уже установлен и имеет значение, отличное от `None`, он не будет изменён. Обратите внимание, что атрибут устанавливается на модуле, возвращаемом загрузчиком, а не на модуле, найденном в [`sys.modules`](https://python-all.ru/3.2/library/sys.html#sys.modules).320321Полагаться на этот декоратор не рекомендуется, когда есть возможность установить `__package__` до начала выполнения кода. Устанавливая его до выполнения кода модуля, этот атрибут можно использовать на глобальном уровне модуля во время инициализации.322