Как правильно включить плагины для моей платформы Python? - PullRequest
0 голосов
/ 04 сентября 2018

Я долго гуглял по этому вопросу, и я не могу найти полное руководство о том, как сделать следующее:

  • Я пишу платформу Python Publisher-Subscriber
  • Я бы хотел отправить несколько подписчиков с моей структурой
  • Подписчики живут в пакете, скажем, framework.subscribers
  • Базовый класс Subscriber, от которого наследуются все подписчики, также находится в framework.subscribers
  • Я хочу, чтобы другие могли предоставлять плагины, то есть писать своих собственных подписчиков, к которым затем можно получить доступ (после установки плагина) по всей системе (или по всему пользователю, в зависимости от среды Python)

В руководстве по упаковке перечислены различные методы без хороших примеров (как с точки зрения фреймворка, так и с точки зрения плагина) и не сказано, какой метод подходит для каких случаев.

Интуитивно, я ожидаю, что установленный плагин также будет импортирован из framework.subscribers. Это хороший способ думать об этом? В настоящее время я понял это так в framework.subscriber.__init__.py

import importlib
import pkg_resources

from .subscriber import Subscriber

__all__ = ['Subscriber']

subscribers = {
    entry_point.name: entry_point.load()
    for entry_point in pkg_resources.iter_entry_points('framework.subscriber')
}
__all__.extend(list(subscribers.keys()))


for name, clazz in subscribers.items():
    locals()[clazz.__name__] = getattr(importlib.import_module(clazz.__module__), clazz.__name__)

В моем setup.py для фреймворка я регистрирую все свои классы подписчиков с помощью

entry_points={
    'framework.subscriber': [
        'FooSubscriber = framework.subscriber.foo:FooSubscriber',
    ]
}

и может делать то же самое из других проектов, которые должны предоставлять плагины. Затем я могу получить к ним доступ как framework.subscriber.BlaSubscriber, даже если они на самом деле не определены в файле framework.subscriber.bla.py или чем-то еще.

Является ли этот подход проблематичным, и как правильно реализовать поддержку плагинов?

...