Как организовать файловую структуру моей уже рабочей сменной системы?

Я работаю над проектом, основной руководящий принцип дизайна которого является расширяемостью.

Я реализовал сменную систему путем определения метакласса, которые регистрируются - в методе класса - имя класса любого плагина, который загружается (каждый тип плагина наследовались определенному классу, определенному в базовом коде, поскольку существуют различные типы плагинов в приложении). В основном это означает, что разработчик должен будет определить свой класс как

class PieChart(ChartPluginAncestor):
    # Duck typing:
    # Implement compulsory methods for Plugins 
    # extending Chart functionality

и основная программа будет знать о его присутствии потому что PieChart будет включен в список зарегистрированных плагинов, доступных в ChartPluginAncestor.plugins.

Будучи способом монтажа, метод класса, все плагины регистрируются, когда их код класса загружается в память (поэтому даже, прежде чем объект того класса инстанцируют).

Система работает хороший enough™ на меня (хотя я всегда открыт для предложений о том, как улучшить архитектуру!), но я теперь задаюсь вопросом, что было бы лучшим способом управлять сменными файлами (т.е. где и как файлы, содержащие плагины, должны храниться).

До сих пор я использую - для разработки целей - пакет, что я назвал "плагины". Я поместил все свои *.py файлы, содержащие классы плагинов в каталоге пакета, и я просто выхожу import plugins в main.py файле, чтобы все плагины были смонтированы правильно.

Править: Jeff указал в комментариях на это import plugins классы, содержавшиеся в различных модулях пакетов, не будут легко доступны (я не понял это, как я был - для отладки целей - импортирующий каждый класс отдельно с from plugins.myAI import AI).

Однако эта система только хороша, в то время как я разрабатываю и тестирую код, как:

  • Плагины могли бы идти со своим собственным unittests, и я не хочу загружать плагины в памяти.
  • Все плагины в настоящее время загружаются в память, но действительно существуют определенные плагины, которые являются альтернативными версиями той же функции, таким образом, действительно просто необходимо знать, что можно переключиться между этими двумя, но Вы хотите загрузить в память просто ту, которую Вы выбрали от области конфигурации.
  • В какой-то момент я захочу иметь двойное расположение для установки плагинов: местоположение в масштабе всей системы (например, где-нибудь под /usr/local/bin/) и определенный для пользователя (например, где-нибудь под /home/<user>/.myprogram/).

Таким образом, мои вопросы действительно - возможно - три:

  1. Сменный контейнер: каков самый разумный выбор для моей цели? единственные файлы? пакеты? простой каталог .py файлов?)
  2. Распознайте присутствие плагинов, обязательно не загружаясь (импорт) их: что умный путь состоит в том, чтобы использовать самоанализ Python, чтобы сделать так?
  3. Размещение плагинов в двух различных местах: существует ли стандартный путь / лучшая практика (под гну/Linux, по крайней мере), чтобы сделать это?
5
задан ROMANIA_engineer 13 January 2018 в 08:53
поделиться