Вступление
Недавно я сделал пакет Python, который позволяет напрямую импортировать файлы JSON. Допустим, у нас есть файлы JSON в файловой структуре ниже.
. ├── info.json └── users ├── chandler.json ├── joey.json ├── monica.json ├── phoebe.json ├── rachel.json └── ross.json
Затем мы можем импортировать эти файлы JSON следующим образом:
>>> import info >>> from users import ross >>> from users import chandler, monica
Конечно, сначала нам нужно установить пакет Python.
pip install git+https://github.com/zaghaghi/direct-json-import.git
Теперь мы можем импортировать этот файл JSON прямо в скрипт Python.
Что такое MetaPathFinder?
Работа с файлами JSON не представляет большого труда для программистов Python, и цель написания этого пакета действительно носит образовательный характер. Это помогает мне понять import
механизм языка Python, и теперь я хочу вам это сказать.
MetaPathFinder
- это класс, который может быть производным и сообщать Python, где и как он может найти и загрузить модуль.
Согласно документации Python, сначала мы должны знать о sys.meta_path
:
Список объектов поиск мета-пути, у которых есть
find_spec()
методы, вызываемые для проверки, может ли один из объектов найти модуль для импорта.
Другими словами, sys.meta_path
- это список объектов, которые Python просит их увидеть, могут ли они найти модуль, соответственно. У каждого из этих объектов должен быть метод с именем find_spec
, который должен возвращать экземпляр ModuleSpec
тогда и только тогда, когда они могут найти модуль и возвращать None
в противном случае.
Очень помогает, если вы видите это сами, поэтому запустите этот код и посмотрите распечатанные результаты.
find_spec(fullname=kishpil, path=None, target=None) find_spec(fullname=kishpil.pishpil, path=_NamespacePath(['.../kishpil', '.../kishpil']), target=None)
Что такое загрузчик?
Затем мы должны знать, как создать экземпляр ModuleSpec
, этому классу нужны name
и loader
. name
- это строка, а loader
- это экземпляр класса, производного от importlib.abc.Loader
.
Существует вспомогательный метод, который создает экземпляр ModuleSpec
из name
и loader
, importlib.util.spec_from_loader
.
Класс Loader
должен реализовывать два метода, create_module
и exec_module
. Согласно документации Python:
create_module
(spec)
Метод, который возвращает объект модуля для использования при импорте модуля. Этот метод может возвращать
None
, указывая, что должна иметь место семантика создания модуля по умолчанию.
exec_module
(модуль)
Абстрактный метод, который выполняет модуль в собственном пространстве имен при импорте или перезагрузке модуля. Модуль уже должен быть инициализирован при вызове
exec_module()
. Если этот метод существует, необходимо определитьcreate_module()
.
Опять же, очень помогает увидеть это самому.
Как использовать повторно?
Наконец, мы должны сделать трюк. Мы не можем выполнять приведенный выше код в наших проектах каждый раз, когда он нам нужен.
Есть два решения этой проблемы. Первый - создать файл с именем sitecustomized.py
с содержимым приведенного выше кода и поместить его в корневой каталог вашего проекта, а другой - создать файл .pth
с содержимым приведенного выше кода и поместить его в корневой каталог Python site-packages
, поэтому каждый раз, когда мы выполняем скрипт Python, этот файл запускается автоматически.
Реальное приложение
Да, я знаю, что делать это на Python - это весело и познавательно, но дайте мне знать, что существуют и реальные приложения!
Больше контента на plainenglish.io