importlib.md
1> **Источник:** https://python-all.ru/3.4/library/importlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 31.5. [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) – Реализация [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import)89Новое в версии 3.1.1011## 31.5.1. Введение1213Пакет [`importlib`](https://python-all.ru/3.4/library/importlib.html#module-importlib) преследует две цели. Первая – предоставить реализацию оператора [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) (и, соответственно, функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__)) на языке Python. Это даёт реализацию [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import), которая переносима на любой интерпретатор Python. Кроме того, такая реализация легче для понимания, чем реализация на другом языке программирования.1415Во-вторых, компоненты, необходимые для реализации [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import), предоставлены в этом пакете, что упрощает пользователям создание собственных объектов (обобщённо называемых [*importer*](https://python-all.ru/3.4/glossary.html#term-importer)) для участия в процессе импорта.1617> **См. также**18>19> **[*Оператор import*](https://python-all.ru/3.4/reference/simple_stmts.html#import)**20>21> Справочное руководство по оператору22>23> [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import)24>25> .26>27> **[Спецификация пакетов](https://python-all.ru/3.4/library/importlib.html)**28>29> Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе30>31> `None`32>33> в34>35> [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules)36>37> ).38>39> **Функция [`__import__()`](https://python-all.ru/3.4/library/importlib.html#importlib.__import__)**40>41> Оператор42>43> [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import)44>45> – это синтаксический сахар для этой функции.46>47> **[**PEP 235**](https://python-all.ru/3.4/library/importlib.html)**48>49> Импорт на платформах, нечувствительных к регистру50>51> **[**PEP 263**](https://python-all.ru/3.4/library/importlib.html)**52>53> Определение кодировок исходного кода Python54>55> **[**PEP 302**](https://python-all.ru/3.4/library/importlib.html)**56>57> Новые хуки импорта58>59> **[**PEP 328**](https://python-all.ru/3.4/library/importlib.html)**60>61> Импорт: многострочный и абсолютный/относительный62>63> **[**PEP 366**](https://python-all.ru/3.4/library/importlib.html)**64>65> Явные относительные импорты в главном модуле66>67> **[**PEP 451**](https://python-all.ru/3.4/library/importlib.html)**68>69> Тип ModuleSpec для системы импорта70>71> **[**PEP 3120**](https://python-all.ru/3.4/library/importlib.html)**72>73> Использование UTF-8 в качестве кодировки исходного кода по умолчанию74>75> **[**PEP 3147**](https://python-all.ru/3.4/library/importlib.html)**76>77> Каталоги репозитория PYC7879## 31.5.2. Функции8081#### `importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)`8283Реализация встроенной функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__).8485#### `importlib.import_module(name, package=None)`8687Импортирует модуль. Аргумент *name* задаёт импортируемый модуль в абсолютном или относительном виде (например, `pkg.mod` или `..mod`). Если имя указано в относительной форме, то аргумент *package* должен быть задан как имя пакета, который будет служить точкой привязки для разрешения имени пакета (например, `import_module('..mod', 'pkg.subpkg')` импортирует `pkg.mod`).8889Функция [`import_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.import_module) является упрощающей обёрткой вокруг [`importlib.__import__()`](https://python-all.ru/3.4/library/importlib.html#importlib.__import__). Это означает, что вся семантика функции наследуется от [`importlib.__import__()`](https://python-all.ru/3.4/library/importlib.html#importlib.__import__), включая требование, чтобы пакет, из которого происходит импорт, был ранее импортирован (т.е. *package* уже должен быть импортирован). Наиболее важное отличие состоит в том, что [`import_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.import_module) возвращает указанный пакет или модуль (например, `pkg.mod`), тогда как [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__) возвращает пакет или модуль верхнего уровня (например, `pkg`).9091Изменено в версии 3.3: Родительские пакеты импортируются автоматически.9293#### `importlib.find_loader(name, path=None)`9495Находит загрузчик для модуля, опционально в указанном *path*. Если модуль находится в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то возвращается `sys.modules[name].__loader__` (если только загрузчик не равен `None` или не установлен; в этом случае возбуждается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError)). В противном случае выполняется поиск по [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path). Если загрузчик не найден, возвращается `None`.9697Для точечного имени родительские пакеты не импортируются неявно, поскольку это требует их загрузки, что может быть нежелательно. Чтобы правильно импортировать подмодуль, необходимо импортировать все родительские пакеты подмодуля и использовать правильный аргумент *path*.9899Новое в версии 3.3.100101Изменено в версии 3.4: Если `__loader__` не установлен, возбуждается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), как и в случае, когда атрибут равен `None`.102103Устарело с версии 3.4: Используйте [`importlib.util.find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.find_spec) вместо этого.104105#### `importlib.invalidate_caches()`106107Сбрасывает внутренние кеши finder'ов, хранящиеся в [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path). Если finder реализует `invalidate_caches()`, то он будет вызван для выполнения сброса. Эту функцию следует вызывать, если во время работы программы создаются или устанавливаются модули, чтобы гарантировать, что все finder'ы заметят существование нового модуля.108109Новое в версии 3.3.110111#### `importlib.reload(module)`112113Перезагружает ранее импортированный модуль *module*. Аргумент должен быть объектом модуля, то есть он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python. Возвращаемое значение – объект модуля (он может отличаться, если повторный импорт помещает другой объект в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules)).114115При выполнении [`reload()`](https://python-all.ru/3.4/library/importlib.html#importlib.reload):116117- Код модуля Python перекомпилируется, а код уровня модуля выполняется заново, что приводит к определению нового набора объектов, которые связываются с именами в словаре модуля путём повторного использования [*loader*](https://python-all.ru/3.4/glossary.html#term-loader), который изначально загрузил модуль. Функция `init` модулей расширения не вызывается повторно.118- Как и все другие объекты в Python, старые объекты освобождаются только после того, как счётчики ссылок на них упадут до нуля.119- Имена в пространстве имён модуля обновляются, чтобы указывать на новые или изменённые объекты.120- Другие ссылки на старые объекты (например, имена вне модуля) не перепривязываются для указания на новые объекты и должны быть обновлены в каждом пространстве имён, где они встречаются, если это необходимо.121122Существует ряд других предостережений:123124Когда модуль перезагружается, его словарь (содержащий глобальные переменные модуля) сохраняется. Переопределения имён заменят старые определения, так что это обычно не проблема. Если новая версия модуля не определяет имя, которое было определено старой версией, старое определение остаётся. Эту возможность можно использовать в интересах модуля, если он поддерживает глобальную таблицу или кеш объектов – с помощью оператора [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try) можно проверить наличие таблицы и пропустить её инициализацию, если это необходимо:125126```python127try:128 cache129except NameError:130 cache = {}131```132133Обычно не имеет смысла перезагружать встроенные или динамически загружаемые модули. Перезагрузка [`sys`](https://python-all.ru/3.4/library/sys.html#module-sys), [`__main__`](https://python-all.ru/3.4/library/__main__.html#module-__main__), [`builtins`](https://python-all.ru/3.4/library/builtins.html#module-builtins) и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не рассчитаны на инициализацию более одного раза и при перезагрузке могут работать непредсказуемо.134135Если модуль импортирует объекты из другого модуля с помощью [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from) ... [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) ..., вызов [`reload()`](https://python-all.ru/3.4/library/importlib.html#importlib.reload) для другого модуля не переопределяет импортированные из него объекты. Один из способов обойти это – повторно выполнить оператор [`from`](https://python-all.ru/3.4/reference/simple_stmts.html#from), другой – использовать [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) и полные имена (*module.name*).136137Если модуль создаёт экземпляры класса, перезагрузка модуля, в котором определён класс, не влияет на определения методов этих экземпляров – они продолжают использовать старое определение класса. То же самое верно и для производных классов.138139Новое в версии 3.4.140141## 31.5.3. [`importlib.abc`](https://python-all.ru/3.4/library/importlib.html#module-importlib.abc) – Абстрактные базовые классы, связанные с импортом142143Модуль [`importlib.abc`](https://python-all.ru/3.4/library/importlib.html#module-importlib.abc) содержит все основные абстрактные базовые классы, используемые [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import). Также предоставляются некоторые подклассы основных абстрактных базовых классов для помощи в реализации базовых ABC.144145Иерархия ABC:146147```python148object149 +-- Finder (deprecated)150 | +-- MetaPathFinder151 | +-- PathEntryFinder152 +-- Loader153 +-- ResourceLoader --------+154 +-- InspectLoader |155 +-- ExecutionLoader --+156 +-- FileLoader157 +-- SourceLoader158```159160#### `class importlib.abc.Finder`161162Абстрактный базовый класс, представляющий [*искатель*](https://python-all.ru/3.4/glossary.html#term-finder).163164Устарело с версии 3.3: Вместо этого используйте [`MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder) или [`PathEntryFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder).165166#### `find_module(fullname, path=None)`167168Абстрактный метод для поиска [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader) для указанного модуля. Изначально описан в [**PEP 302**](https://python-all.ru/3.4/library/importlib.html), этот метод предназначался для использования в [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path) и в подсистеме импорта на основе путей.169170Изменено в версии 3.4: Возвращает `None` при вызове вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).171172#### `class importlib.abc.MetaPathFinder`173174Абстрактный базовый класс, представляющий [*мета-искатель путей*](https://python-all.ru/3.4/glossary.html#term-meta-path-finder). Для совместимости это подкласс [`Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder).175176Новое в версии 3.3.177178#### `find_spec(fullname, path, target=None)`179180Абстрактный метод для поиска [*спецификации*](https://python-all.ru/3.4/glossary.html#term-module-spec) для указанного модуля. Если это импорт верхнего уровня, *path* будет `None`. В противном случае это поиск подпакета или модуля, и *path* будет значением [`__path__`](https://python-all.ru/3.4/reference/import.html#__path__) из родительского пакета. Если спецификацию найти не удается, возвращается `None`. При передаче `target` – это объект модуля, который искатель может использовать для более обоснованного выбора, какую спецификацию вернуть.181182Новое в версии 3.4.183184#### `find_module(fullname, path)`185186Устаревший метод для поиска [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader) для указанного модуля. Если это импорт верхнего уровня, *path* будет `None`. В противном случае это поиск подпакета или модуля, и *path* будет значением [`__path__`](https://python-all.ru/3.4/reference/import.html#__path__) из родительского пакета. Если загрузчик не найден, возвращается `None`.187188Если [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) определён, предоставляется обратно-совместимая функциональность.189190Изменено в версии 3.4: Возвращает `None` при вызове вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Можно использовать [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_spec) для предоставления функциональности.191192Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder.find_spec).193194#### `invalidate_caches()`195196Необязательный метод, который при вызове должен аннулировать любой внутренний кеш, используемый искателем. Используется [`importlib.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.invalidate_caches) при аннулировании кешей всех искателей на [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path).197198Изменено в версии 3.4: Возвращает `None` при вызове вместо `NotImplemented`.199200#### `class importlib.abc.PathEntryFinder`201202Абстрактный базовый класс, представляющий [*искатель записей пути*](https://python-all.ru/3.4/glossary.html#term-path-entry-finder). Хотя он имеет некоторое сходство с [`MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder), `PathEntryFinder` предназначен для использования только в подсистеме импорта на основе путей, предоставленной `PathFinder`. Этот ABC является подклассом [`Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder) только по соображениям совместимости.203204Новое в версии 3.3.205206#### `find_spec(fullname, target=None)`207208Абстрактный метод для поиска [*спецификации*](https://python-all.ru/3.4/glossary.html#term-module-spec) для указанного модуля. Искатель будет искать модуль только в пределах [*записи пути*](https://python-all.ru/3.4/glossary.html#term-path-entry), к которой он приписан. Если спецификацию найти не удается, возвращается `None`. При передаче `target` – это объект модуля, который искатель может использовать для более обоснованного выбора, какую спецификацию вернуть.209210Новое в версии 3.4.211212#### `find_loader(fullname)`213214Устаревший метод для поиска [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader) для указанного модуля. Возвращает кортеж из двух элементов `(loader, portion)`, где `portion` – это последовательность местоположений файловой системы, вносящих вклад в часть пространства имён пакета. Загрузчик может быть `None`, а `portion` указывает на вклад расположений файловой системы в пространство имён пакета. Пустой список может использоваться для `portion`, чтобы указать, что загрузчик не является частью пространства имён пакета. Если `loader` равен `None`, а `portion` – пустой список, то не было найдено ни загрузчика, ни местоположения для пространства имён пакета (т.е. не удалось найти ничего для модуля).215216Если [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec) определён, предоставляется обратно-совместимая функциональность.217218Изменено в версии 3.4: Возвращает `(None, [])` вместо возбуждения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Использует [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec), если доступен, для предоставления функциональности.219220Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).221222#### `find_module(fullname)`223224Конкретная реализация [`Finder.find_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder.find_module), которая эквивалентна `self.find_loader(fullname)[0]`.225226Устарело с версии 3.4: вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.find_spec).227228#### `invalidate_caches()`229230Необязательный метод, который при вызове должен сбрасывать любой внутренний кеш, используемый искателем. Используется `PathFinder.invalidate_caches()` при сбросе кешей всех кешированных искателей.231232#### `class importlib.abc.Loader`233234Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader). См. [**PEP 302**](https://python-all.ru/3.4/library/importlib.html) для точного определения загрузчика.235236#### `create_module(spec)`237238Необязательный метод, возвращающий объект модуля для использования при импорте модуля. create\_module() также может вернуть `None`, что означает, что вместо этого должно использоваться создание модуля по умолчанию.239240Новое в версии 3.4.241242#### `exec_module(module)`243244Абстрактный метод, который выполняет модуль в его собственном пространстве имён при импорте или перезагрузке модуля. Модуль должен уже быть инициализирован к моменту вызова exec\_module().245246Новое в версии 3.4.247248#### `load_module(fullname)`249250Устаревший метод для загрузки модуля. Если модуль не может быть загружен, вызывается [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), в противном случае возвращается загруженный модуль.251252Если запрошенный модуль уже существует в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), этот модуль следует использовать и перезагрузить. В противном случае загрузчик должен создать новый модуль и вставить его в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules) до начала загрузки, чтобы предотвратить рекурсию при импорте. Если загрузчик вставил модуль и загрузка не удалась, он должен быть удален загрузчиком из [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules); модули, уже находившиеся в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules) до начала выполнения загрузчика, следует оставить без изменений (см. [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader)).253254Загрузчик должен установить несколько атрибутов модуля. (Обратите внимание, что некоторые из этих атрибутов могут измениться при перезагрузке модуля):255256- **[`__name__`](https://python-all.ru/3.4/reference/import.html#__name__)**257258 Имя модуля.259- **[`__file__`](https://python-all.ru/3.4/reference/import.html#__file__)**260261 Путь к месту хранения данных модуля (не задан для встроенных модулей).262- **[`__cached__`](https://python-all.ru/3.4/reference/import.html#__cached__)**263264 Путь к месту, где хранится или должна храниться скомпилированная версия модуля (не задан, если атрибут неуместен).265- **[`__path__`](https://python-all.ru/3.4/reference/import.html#__path__)**266267 Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.268- **[`__package__`](https://python-all.ru/3.4/reference/import.html#__package__)**269270 Родительский пакет для модуля/пакета. Если модуль верхнего уровня, то значение – пустая строка. Декоратор271272 [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader)273274 может обрабатывать детали для275276 [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__)277278 .279- **[`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__)**280281 Загрузчик, используемый для загрузки модуля. Декоратор282283 [`importlib.util.module_for_loader()`](https://python-all.ru/3.4/library/importlib.html#importlib.util.module_for_loader)284285 может обрабатывать детали для286287 [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__)288289 .290291Когда [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module) доступен, предоставляется обратно совместимая функциональность.292293Изменено в версии 3.4: При вызове теперь вызывает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Функциональность предоставляется, когда доступен [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module).294295Устарело с версии 3.4: Рекомендуемый API для загрузки модуля – [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module) (и опционально [`create_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.create_module)). Загрузчики должны реализовывать его вместо load\_module(). Механизм импорта берет на себя все остальные обязанности load\_module(), когда реализован exec\_module().296297#### `module_repr(module)`298299Устаревший метод, который при реализации вычисляет и возвращает строковое представление заданного модуля в виде строки. Стандартный repr() для типа модуля будет использовать результат этого метода по необходимости.300301Новое в версии 3.3.302303Изменено в версии 3.4: Сделано необязательным вместо абстрактного метода.304305Устарело с версии 3.4: Механизм импорта теперь заботится об этом автоматически.306307#### `class importlib.abc.ResourceLoader`308309Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.4/library/importlib.html) для загрузки произвольных ресурсов из бэкенда хранилища.310311#### `get_data(path)`312313Абстрактный метод, возвращающий байты данных, расположенных по *path*. Загрузчики, имеющие файлоподобное хранилище, позволяющее хранить произвольные данные, могут реализовать этот абстрактный метод для прямого доступа к сохраненным данным. Если *path* не может быть найден, должно вызываться [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Ожидается, что *path* будет построен с использованием атрибута [`__file__`](https://python-all.ru/3.4/reference/import.html#__file__) модуля или элемента из [`__path__`](https://python-all.ru/3.4/reference/import.html#__path__) пакета.314315Изменено в версии 3.4: Вызывает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).316317#### `class importlib.abc.InspectLoader`318319Абстрактный базовый класс для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader), который реализует опциональный протокол [**PEP 302**](https://python-all.ru/3.4/library/importlib.html) для загрузчиков, которые инспектируют модули.320321#### `get_code(fullname)`322323Возвращает объект кода для модуля или `None`, если модуль не имеет объекта кода (как, например, для встроенного модуля). Вызывает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), если загрузчик не может найти запрошенный модуль.324325> **Примечание**326>327> Хотя метод имеет реализацию по умолчанию, рекомендуется переопределить его, если это возможно для повышения производительности.328329Изменено в версии 3.4: Больше не является абстрактным, предоставлена конкретная реализация.330331#### `get_source(fullname)`332333Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием [*универсальных символов новой строки*](https://python-all.ru/3.4/glossary.html#term-universal-newlines), преобразуя все распознаваемые разделители строк в символы `'\n'`. Возвращает `None`, если исходный код недоступен (например, для встроенного модуля). Вызывает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), если загрузчик не может найти указанный модуль.334335Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).336337#### `is_package(fullname)`338339Абстрактный метод, возвращающий истинное значение, если модуль является пакетом, и ложное в противном случае. [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) возбуждается, если [*загрузчик*](https://python-all.ru/3.4/glossary.html#term-loader) не может найти модуль.340341Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).342343#### `source_to_code(data, path='<string>')`344345Создаёт объект кода из исходного кода Python.346347Аргумент *data* может быть любым типом, который поддерживает функция [`compile()`](https://python-all.ru/3.4/library/functions.html#compile) (например, строка или байты). Аргумент *path* должен быть «путём» к источнику исходного кода, который может быть абстрактным понятием (например, расположение в zip-файле).348349Новое в версии 3.4.350351#### `exec_module(module)`352353Реализация метода [`Loader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module).354355Новое в версии 3.4.356357#### `load_module(fullname)`358359Реализация метода [`Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module).360361Устарело с версии 3.4: используйте [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.exec_module) вместо этого.362363#### `class importlib.abc.ExecutionLoader`364365Абстрактный базовый класс, наследующий от [`InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader), который при реализации помогает выполнять модуль как скрипт. Этот ABC представляет необязательный протокол [**PEP 302**](https://python-all.ru/3.4/library/importlib.html).366367#### `get_filename(fullname)`368369Абстрактный метод, который должен возвращать значение [`__file__`](https://python-all.ru/3.4/reference/import.html#__file__) для указанного модуля. Если путь недоступен, возбуждается [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError).370371Если исходный код доступен, метод должен возвращать путь к файлу исходного кода, независимо от того, использовался ли байткод для загрузки модуля.372373Изменено в версии 3.4: Возбуждает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).374375#### `class importlib.abc.FileLoader(fullname, path)`376377Абстрактный базовый класс, наследующий от [`ResourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader) и [`ExecutionLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader), предоставляющий конкретные реализации методов [`ResourceLoader.get_data()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader.get_data) и [`ExecutionLoader.get_filename()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader.get_filename).378379Аргумент *fullname* – это полное разрешённое имя модуля, который должен обрабатывать загрузчик. Аргумент *path* – путь к файлу модуля.380381Новое в версии 3.3.382383#### `name`384385Имя модуля, который может обрабатывать загрузчик.386387#### `path`388389Путь к файлу модуля.390391#### `load_module(fullname)`392393Вызывает `load_module()` родительского класса.394395Устарело с версии 3.4: Используйте [`Loader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module) вместо этого.396397#### `get_filename(fullname)`398399Возвращает [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader.path).400401#### `get_data(path)`402403Читает *path* как двоичный файл и возвращает байты из него.404405#### `class importlib.abc.SourceLoader`406407Абстрактный базовый класс для реализации загрузки исходных (и, опционально, байт-кодовых) файлов. Этот класс наследует как от [`ResourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader), так и от [`ExecutionLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader), требуя реализации следующих методов:408409- [`ResourceLoader.get_data()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ResourceLoader.get_data)410- **[`ExecutionLoader.get_filename()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)**411412 Должен возвращать только путь к файлу исходного кода; загрузка без исходного кода не поддерживается.413414Абстрактные методы, определенные этим классом, предназначены для добавления опциональной поддержки байт-кодовых файлов. Отсутствие реализации этих опциональных методов (или возникновение в них исключения [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError)) приводит к тому, что загрузчик работает только с исходным кодом. Реализация этих методов позволяет загрузчику работать с исходными *и* байт-кодовыми файлами; она не поддерживает *безысходную* загрузку, когда предоставляется только байт-код. Байт-кодовые файлы представляют собой оптимизацию для ускорения загрузки за счет исключения этапа парсинга компилятора Python, поэтому не предоставляется никакого API, специфичного для байт-кода.415416#### `path_stats(path)`417418Необязательный абстрактный метод, возвращающий [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict), содержащий метаданные о указанном пути. Поддерживаемые ключи словаря:419420- `'mtime'` (обязательно): целое число или число с плавающей точкой, представляющее время изменения исходного кода;421- `'size'` (необязательно): размер исходного кода в байтах.422423Все остальные ключи словаря игнорируются, чтобы обеспечить возможность будущих расширений. Если путь не может быть обработан, возбуждается [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).424425Новое в версии 3.3.426427Изменено в версии 3.4: Возбуждает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).428429#### `path_mtime(path)`430431Необязательный абстрактный метод, возвращающий время изменения указанного пути.432433Устарело с версии 3.3: Этот метод устарел в пользу [`path_stats()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.path_stats). Его не обязательно реализовывать, но он всё ещё доступен для совместимости. Возбуждает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), если путь не может быть обработан.434435Изменено в версии 3.4: Возбуждает [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) вместо [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).436437#### `set_data(path, data)`438439Необязательный абстрактный метод, записывающий указанные байты в файл по заданному пути. Все недостающие промежуточные каталоги должны быть созданы автоматически.440441Если запись по пути не удаётся, потому что путь доступен только для чтения ([`errno.EACCES`](https://python-all.ru/3.4/library/errno.html#errno.EACCES)/[`PermissionError`](https://python-all.ru/3.4/library/exceptions.html#PermissionError)), не распространяйте исключение.442443Изменено в версии 3.4: Больше не возбуждает [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError) при вызове.444445#### `get_code(fullname)`446447Конкретная реализация метода [`InspectLoader.get_code()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_code).448449#### `exec_module(module)`450451> Конкретная реализация метода452>453> [`Loader.exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.exec_module)454>455> .456457Новое в версии 3.4.458459#### `load_module(fullname)`460461Конкретная реализация метода [`Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module).462463Устарело с версии 3.4: Вместо этого используйте [`exec_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.exec_module).464465#### `get_source(fullname)`466467Конкретная реализация метода [`InspectLoader.get_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_source).468469#### `is_package(fullname)`470471Конкретная реализация метода [`InspectLoader.is_package()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.is_package). Модуль считается пакетом, если его путь к файлу (как указано в [`ExecutionLoader.get_filename()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader.get_filename)) является файлом с именем `__init__` после удаления расширения файла **и** имя самого модуля не заканчивается на `__init__`.472473## 31.5.4. [`importlib.machinery`](https://python-all.ru/3.4/library/importlib.html#module-importlib.machinery) – Импортеры и перехватчики путей474475Этот модуль содержит различные объекты, которые помогают [`import`](https://python-all.ru/3.4/reference/simple_stmts.html#import) находить и загружать модули.476477#### `importlib.machinery.SOURCE_SUFFIXES`478479Список строк, представляющих распознаваемые расширения файлов для исходных модулей.480481Новое в версии 3.3.482483#### `importlib.machinery.DEBUG_BYTECODE_SUFFIXES`484485Список строк, представляющих расширения файлов для неоптимизированных байт-код модулей.486487Новое в версии 3.3.488489#### `importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES`490491Список строк с расширениями файлов для оптимизированных модулей байткода.492493Новое в версии 3.3.494495#### `importlib.machinery.BYTECODE_SUFFIXES`496497Список строк, представляющих распознаваемые расширения файлов для байткод-модулей. Устанавливается в [`DEBUG_BYTECODE_SUFFIXES`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.DEBUG_BYTECODE_SUFFIXES) или [`OPTIMIZED_BYTECODE_SUFFIXES`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES) в зависимости от того, является ли `__debug__` истинным.498499Новое в версии 3.3.500501#### `importlib.machinery.EXTENSION_SUFFIXES`502503Список строк с распознаваемыми расширениями файлов для модулей расширений.504505Новое в версии 3.3.506507#### `importlib.machinery.all_suffixes()`508509Возвращает объединённый список строк, представляющих все расширения файлов для модулей, распознаваемых стандартным механизмом импорта. Это вспомогательная функция для кода, которому нужно просто узнать, относится ли путь файловой системы потенциально к модулю, без необходимости в деталях о типе модуля (например, [`inspect.getmodulename()`](https://python-all.ru/3.4/library/inspect.html#inspect.getmodulename)).510511Новое в версии 3.3.512513#### `class importlib.machinery.BuiltinImporter`514515[*Импортер*](https://python-all.ru/3.4/glossary.html#term-importer) для встроенных модулей. Все известные встроенные модули перечислены в [`sys.builtin_module_names`](https://python-all.ru/3.4/library/sys.html#sys.builtin_module_names). Этот класс реализует ABC [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader).516517В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.518519> **Примечание**520>521> Из-за ограничений C-API модулей расширения, в настоящее время BuiltinImporter не реализует `Loader.exec_module()`.522523#### `class importlib.machinery.FrozenImporter`524525[*Импортер*](https://python-all.ru/3.4/glossary.html#term-importer) для замороженных модулей. Этот класс реализует ABC [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder) и [`importlib.abc.InspectLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader).526527В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.528529#### `class importlib.machinery.WindowsRegistryFinder`530531[*Finder*](https://python-all.ru/3.4/glossary.html#term-finder) для модулей, объявленных в реестре Windows. Этот класс реализует ABC [`importlib.abc.Finder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Finder).532533В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.534535Новое в версии 3.3.536537#### `class importlib.machinery.PathFinder`538539[*Finder*](https://python-all.ru/3.4/glossary.html#term-finder) для [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path) и атрибутов `__path__` пакета. Этот класс реализует ABC [`importlib.abc.MetaPathFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.MetaPathFinder).540541В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.542543#### `classmethod find_spec(fullname, path=None, target=None)`544545Метод класса, который пытается найти [*спецификацию*](https://python-all.ru/3.4/glossary.html#term-module-spec) для модуля, заданного *fullname*, в [`sys.path`](https://python-all.ru/3.4/library/sys.html#sys.path) или, если указан, в *path*. Для каждого проверяемого элемента пути проверяется [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache). Если найден объект, не являющийся ложным, он используется как [*поисковик для элемента пути*](https://python-all.ru/3.4/glossary.html#term-path-entry-finder) для поиска модуля. Если в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache) запись не найдена, то [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) просматривается в поисках поисковика для этого элемента пути, и если он найден, сохраняется в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache), а также запрашивается о модуле. Если поисковик так и не найден, то `None` как сохраняется в кэше, так и возвращается.546547Новое в версии 3.4.548549#### `classmethod find_module(fullname, path=None)`550551Устаревшая обёртка вокруг [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.PathFinder.find_spec).552553Устарело с версии 3.4: Вместо этого используйте [`find_spec()`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.PathFinder.find_spec).554555#### `classmethod invalidate_caches()`556557Вызывает [`importlib.abc.PathEntryFinder.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder.invalidate_caches) для всех поисковиков, хранящихся в [`sys.path_importer_cache`](https://python-all.ru/3.4/library/sys.html#sys.path_importer_cache).558559Изменено в версии 3.4: Вызывает объекты в [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks) с текущей рабочей директорией для `''` (т.е. пустой строкой).560561#### `class importlib.machinery.FileFinder(path, *loader_details)`562563Конкретная реализация [`importlib.abc.PathEntryFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.PathEntryFinder), которая кэширует результаты из файловой системы.564565Аргумент *path* – это каталог, за поиск в котором отвечает искатель.566567Аргумент *loader\_details* – это переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознает. Загрузчики должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.568569Поисковик будет кэшировать содержимое каталогов по мере необходимости, выполняя вызовы stat для каждого поиска модуля, чтобы убедиться, что кэш не устарел. Поскольку устаревание кэша зависит от точности информации о состоянии файловой системы, предоставляемой операционной системой, существует потенциальное состояние гонки: поиск модуля, создание нового файла и последующий поиск модуля, который представляет этот новый файл. Если операции выполняются достаточно быстро, чтобы уложиться в точность вызовов stat, то поиск модуля завершится неудачей. Чтобы этого избежать, при динамическом создании модуля обязательно вызывайте [`importlib.invalidate_caches()`](https://python-all.ru/3.4/library/importlib.html#importlib.invalidate_caches).570571Новое в версии 3.3.572573#### `path`574575Путь, в котором будет искать искатель.576577#### `find_spec(fullname, target=None)`578579Попытка найти спецификацию для обработки *fullname* в [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FileFinder.path).580581Новое в версии 3.4.582583#### `find_loader(fullname)`584585Попытка найти загрузчик для обработки *fullname* в [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FileFinder.path).586587#### `invalidate_caches()`588589Очищает внутренний кеш.590591#### `classmethod path_hook(*loader_details)`592593Метод класса, который возвращает замыкание для использования в [`sys.path_hooks`](https://python-all.ru/3.4/library/sys.html#sys.path_hooks). Замыкание возвращает экземпляр [`FileFinder`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.FileFinder), используя аргумент path, переданный замыканию напрямую, и *loader\_details* косвенно.594595Если аргумент замыкания не является существующим каталогом, возникает [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError).596597#### `class importlib.machinery.SourceFileLoader(fullname, path)`598599Конкретная реализация [`importlib.abc.SourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader) путем наследования от [`importlib.abc.FileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader) и предоставления некоторых конкретных реализаций других методов.600601Новое в версии 3.3.602603#### `name`604605Имя модуля, который будет обрабатывать этот загрузчик.606607#### `path`608609Путь к исходному файлу.610611#### `is_package(fullname)`612613Возвращает true, если [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourceFileLoader.path) указывает на пакет.614615#### `path_stats(path)`616617Конкретная реализация [`importlib.abc.SourceLoader.path_stats()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.path_stats).618619#### `set_data(path, data)`620621Конкретная реализация [`importlib.abc.SourceLoader.set_data()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader.set_data).622623#### `load_module(name=None)`624625Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.626627#### `class importlib.machinery.SourcelessFileLoader(fullname, path)`628629Конкретная реализация [`importlib.abc.FileLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.FileLoader), которая может импортировать файлы байт-кода (т.е. файлы исходного кода отсутствуют).630631Обратите внимание, что прямое использование файлов байт-кода (а не файлов исходного кода) препятствует тому, чтобы ваши модули могли использоваться всеми реализациями Python или новыми версиями Python, изменяющими формат байт-кода.632633Новое в версии 3.3.634635#### `name`636637Имя модуля, который будет обрабатывать загрузчик.638639#### `path`640641Путь к файлу байт-кода.642643#### `is_package(fullname)`644645Определяет, является ли модуль пакетом, на основе [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).646647#### `get_code(fullname)`648649Возвращает объект кода для [`name`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourcelessFileLoader.name), созданный из [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.SourcelessFileLoader.path).650651#### `get_source(fullname)`652653Возвращает `None`, поскольку при использовании этого загрузчика файлы байт-кода не имеют исходного кода.654655#### `load_module(name=None)`656657Конкретная реализация [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), где указание имени загружаемого модуля необязательно.658659#### `class importlib.machinery.ExtensionFileLoader(fullname, path)`660661Конкретная реализация [`importlib.abc.ExecutionLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.ExecutionLoader) для модулей расширения.662663Аргумент *fullname* задаёт имя модуля, который должен поддерживать загрузчик. Аргумент *path* – это путь к файлу модуля-расширения.664665Новое в версии 3.3.666667#### `name`668669Имя модуля, который поддерживает загрузчик.670671#### `path`672673Путь к модулю-расширению.674675#### `load_module(name=None)`676677Загружает модуль расширения только в том случае, если *fullname* совпадает с [`name`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.ExtensionFileLoader.name) или является `None`.678679> **Примечание**680>681> Из-за ограничений C-API модулей расширения на данный момент ExtensionFileLoader не реализует `Loader.exec_module()`.682683#### `is_package(fullname)`684685Возвращает `True`, если путь к файлу указывает на модуль `__init__` пакета на основе [`EXTENSION_SUFFIXES`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.EXTENSION_SUFFIXES).686687#### `get_code(fullname)`688689Возвращает `None`, поскольку у модулей расширения нет объекта кода.690691#### `get_source(fullname)`692693Возвращает `None`, поскольку модули-расширения не имеют исходного кода.694695#### `get_filename(fullname)`696697Возвращает [`path`](https://python-all.ru/3.4/library/importlib.html#importlib.machinery.ExtensionFileLoader.path).698699Новое в версии 3.4.700701#### `class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)`702703Спецификация состояния модуля, связанного с системой импорта.704705Новое в версии 3.4.706707#### `name`708709(`__name__`)710711Строка с полным именем модуля.712713#### `loader`714715(`__loader__`)716717Загрузчик, используемый для загрузки. Для пакетов пространства имён его следует установить в None.718719#### `origin`720721(`__file__`)722723Имя места, из которого загружается модуль, например «builtin» для встроенных модулей и имя файла для модулей, загружаемых из исходного кода. Обычно «origin» следует задавать, но оно может быть None (по умолчанию), что означает, что оно не указано.724725#### `submodule_search_locations`726727(`__path__`)728729Список строк, указывающих, где искать подмодули, если это пакет (в противном случае None).730731#### `loader_state`732733Контейнер дополнительных данных, специфичных для модуля, используемых во время загрузки (или None).734735#### `cached`736737(`__cached__`)738739Строка, указывающая, где должен храниться скомпилированный модуль (или None).740741#### `parent`742743(`__package__`)744745(Только для чтения) Полное имя пакета, которому модуль принадлежит как подмодуль (или None).746747#### `has_location`748749Логическое значение, указывающее, относится ли атрибут «origin» модуля к загружаемому расположению.750751## 31.5.5. [`importlib.util`](https://python-all.ru/3.4/library/importlib.html#module-importlib.util) – Вспомогательный код для импортеров752753Этот модуль содержит различные объекты, помогающие в создании [*импортёра*](https://python-all.ru/3.4/glossary.html#term-importer).754755#### `importlib.util.MAGIC_NUMBER`756757Байты, представляющие номер версии байткода. Если вам нужна помощь с загрузкой или записью байткода, воспользуйтесь [`importlib.abc.SourceLoader`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.SourceLoader).758759Новое в версии 3.4.760761#### `importlib.util.cache_from_source(path, debug_override=None)`762763Возвращает путь по стандарту [**PEP 3147**](https://python-all.ru/3.4/library/importlib.html) к файлу скомпилированного байткода, связанному с исходным файлом *path*. Например, если *path* равен `/foo/bar/baz.py`, то для Python 3.2 возвращаемое значение будет равно `/foo/bar/__pycache__/baz.cpython-32.pyc`. Строка `cpython-32` берётся из текущего магического тега (см. `get_tag()`; если `sys.implementation.cache_tag` не определён, будет возбуждено [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError)). Возвращаемый путь будет заканчиваться на `.pyc`, когда `__debug__` равно `True`, или на `.pyo` для оптимизированного Python (т.е. когда `__debug__` равно `False`). Передав `True` или `False` в качестве *debug\_override*, можно переопределить системное значение `__debug__` для выбора расширения.764765*path* не обязан существовать.766767Новое в версии 3.4.768769#### `importlib.util.source_from_cache(path)`770771По заданному пути *path* к имени файла в формате [**PEP 3147**](https://python-all.ru/3.4/library/importlib.html) возвращает путь к соответствующему исходному файлу. Например, если *path* равен `/foo/bar/__pycache__/baz.cpython-32.pyc`, возвращаемый путь будет `/foo/bar/baz.py`. *path* может не существовать, однако если он не соответствует формату [**PEP 3147**](https://python-all.ru/3.4/library/importlib.html), возбуждается `ValueError`. Если `sys.implementation.cache_tag` не определён, возбуждается [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError).772773Новое в версии 3.4.774775#### `importlib.util.decode_source(source_bytes)`776777Декодирует переданные байты, представляющие исходный код, и возвращает его в виде строки с универсальными символами новой строки (как требуется [`importlib.abc.InspectLoader.get_source()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.get_source)).778779Новое в версии 3.4.780781#### `importlib.util.resolve_name(name, package)`782783Преобразует относительное имя модуля в абсолютное.784785Если **name** не содержит начальных точек, то просто возвращается **name**. Это позволяет использовать, например, `importlib.util.resolve_name('sys', __package__)` без проверки того,\\нуказан ли аргумент **package**.786787[`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) возникает, если **name** является относительным именем модуля, но package имеет ложное значение (например, `None` или пустая строка). [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) также возникает, если относительное имя выходит за пределы содержащего пакета (например, запрос `..bacon` из пакета `spam`).788789Новое в версии 3.3.790791#### `importlib.util.find_spec(name, package=None)`792793Находит [*спецификацию*](https://python-all.ru/3.4/glossary.html#term-module-spec) для модуля, возможно, относительно указанного имени **package**. Если модуль уже есть в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то возвращается `sys.modules[name].__spec__` (если только спецификация не `None` или не задана, и в этом случае вызывается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError)). В противном случае выполняется поиск с помощью [`sys.meta_path`](https://python-all.ru/3.4/library/sys.html#sys.meta_path). `None` возвращается, если спецификация не найдена.794795Если **name** относится к подмодулю (содержит точку), родительский модуль импортируется автоматически.796797**name** и **package** работают так же, как для `import_module()`.798799Новое в версии 3.4.800801#### `@importlib.util.module_for_loader`802803[*Декоратор*](https://python-all.ru/3.4/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), предназначенный для выбора подходящего объекта модуля для загрузки. Декорированный метод должен иметь сигнатуру вызова с двумя позиционными аргументами (например, `load_module(self, module)`), где второй аргумент будет модулем **object**, используемым загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами, так как предполагается наличие двух аргументов.804805Декорированный метод будет принимать **name** загружаемого модуля, как и ожидается для [*загрузчика*](https://python-all.ru/3.4/glossary.html#term-loader). Если модуль не найден в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то создаётся новый. Независимо от того, откуда взялся модуль, [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) устанавливается в **self**, а [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) устанавливается на основе того, что возвращает [`importlib.abc.InspectLoader.is_package()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.InspectLoader.is_package) (если доступно). Эти атрибуты устанавливаются безусловно для поддержки перезагрузки.806807Если декорированный метод вызывает исключение и модуль был добавлен в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то модуль будет удалён, чтобы предотвратить оставление частично инициализированного модуля в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules). Если модуль уже был в [`sys.modules`](https://python-all.ru/3.4/library/sys.html#sys.modules), то он остаётся нетронутым.808809Изменено в версии 3.3: [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) и [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) теперь устанавливаются автоматически (когда это возможно).810811Изменено в версии 3.4: Устанавливаются [`__name__`](https://python-all.ru/3.4/reference/import.html#__name__), [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) безусловно для поддержки перезагрузки.812813Устарело с версии 3.4: Механизм импорта теперь напрямую выполняет все функции, предоставляемые этой функцией.814815#### `@importlib.util.set_loader`816817[*Декоратор*](https://python-all.ru/3.4/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), устанавливающий атрибут [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__) на возвращаемом модуле. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обёрнутого метода (т.е. `self`) и есть значение, на которое должен быть установлен [`__loader__`](https://python-all.ru/3.4/reference/import.html#__loader__).818819Изменено в версии 3.4: Устанавливается `__loader__`, если он установлен в `None`, как если бы атрибут не существовал.820821Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.822823#### `@importlib.util.set_package`824825[*Декоратор*](https://python-all.ru/3.4/glossary.html#term-decorator) для [`importlib.abc.Loader.load_module()`](https://python-all.ru/3.4/library/importlib.html#importlib.abc.Loader.load_module), устанавливающий атрибут [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) на возвращаемом модуле. Если [`__package__`](https://python-all.ru/3.4/reference/import.html#__package__) уже установлен и имеет значение, отличное от `None`, то он не будет изменён.826827Устарело с версии 3.4: Механизм импорта заботится об этом автоматически.828829#### `importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)`830831Фабричная функция для создания экземпляра `ModuleSpec` на основе загрузчика. Параметры имеют тот же смысл, что и для ModuleSpec. Функция использует доступные API загрузчика [*loader*](https://python-all.ru/3.4/glossary.html#term-loader), такие как `InspectLoader.is_package()`, для заполнения любой отсутствующей информации в спецификации.832833Новое в версии 3.4.834835#### `importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)`836837Фабричная функция для создания экземпляра `ModuleSpec` на основе пути к файлу. Недостающая информация будет заполнена в спецификации с использованием API загрузчика и предположения, что модуль основан на файле.838839Новое в версии 3.4.840