Вступление

Недавно я сделал пакет 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