В настоящее время я пишу приложение, которое позволяет пользователю расширять его с помощью архитектуры типа «плагин». Они могут писать дополнительные классы python на основе объекта BaseClass, который я предоставляю, и они загружаются с различными сигналами приложения. Точное число и имена классов, загружаемых как плагины, неизвестны до запуска приложения, но загружаются только один раз при запуске.Архитектура плагина - Plugin Manager vs проверка с импорта плагинов *
Во время моего исследования наилучшего способа решения этого вопроса я придумал два общих решения.
Вариант 1 - ролл свой собственный, используя имп, pkgutil и т.д.
смотри, например, this answer или this one.
Вариант 2 - Использование библиотеки менеджер плагин
Случайным собирание пару
Мой вопрос - на том условии, что заявление должно быть рестартом Ted, чтобы загрузить новые плагины - есть ли польза от вышеперечисленных методов над чем-то вдохновляли от this SO answer и this one, таких как:
import inspect
import sys
import my_plugins
def predicate(c):
# filter to classes
return inspect.isclass(c)
def load_plugins():
for name, obj in inspect.getmembers(sys.modules['my_plugins'], predicate):
obj.register_signals()
Существуют ли какие-либо недостатки этого подхода по сравнению с представленным выше? (кроме всех плагинов должны быть в одном файле) Спасибо!
EDIT
Комментарии запросить дополнительную информацию ... только дополнительная вещь, которую я могу думать, чтобы добавить, что модули используют blinker библиотеку, чтобы обеспечить сигналы, которые они подписываются. Каждый плагин может подписаться на разные сигналы разных типов и, следовательно, должен иметь свой собственный конкретный метод «регистрации».
Если вы используете [этот подход] (HTTP : //martyalchin.com/2008/jan/10/simple-plugin-framework/), то вам не нужны функции load_plugins и предикат. И я предлагаю. – Wessie
Спасибо - да, я видел эту статью ... это хороший подход. Однако, поскольку каждый плагин будет иметь другую регистрационную функцию, мне, по-видимому, нужно будет все равно перебирать плагины и регистрировать регистр отдельно? Это кажется значительно более сложным, чем выше? –
Вам нужно объяснить немного больше того, чего вы точно хотите. Если вы используете идею из статьи, ваш класс «Base» будет иметь атрибут класса, который содержит все зарегистрированные «Plugins». – Wessie