Выберите адаптер динамически в зависимости от установленной библиотеки
Я проектирую библиотеку, которая имеет адаптеры, которые поддерживают широкий спектр библиотек. Я хочу, чтобы библиотека динамически выбирала, какой адаптер, на котором установлена библиотека, установлен на компьютере при импорте определенных классов.
Цель состоит в том, чтобы иметь возможность изменять библиотеку, от которой зависит программа, без необходимости вносить изменения в код. Эта особенность предназначена для обработки соединений RabbitMQ, так как у нас было много проблем спищухамы хотим иметь возможность перейти на другую библиотеку, напримерpyAMPQ или жеrabbitpy без необходимости изменения базового кода.
Я думал о реализации чего-то подобного в__init__.py
файл изservicelibrary.simple
.
try:
#import pika # Is pika installed?
from servicelibrary.simple.synchronous import Publisher
from servicelibrary.simple.synchronous import Consumer
except ImportError:
#import ampq # Is ampq installed?
from servicelibrary.simple.alternative import Publisher
from servicelibrary.simple.alternative import Consumer
Затем, когда пользователь импортирует библиотеку
from servicelibrary.simple import Publisher
Базовый слой выглядит примерно так
alternative.py
import amqp
class Publisher(object):
......
class Consumer(object):
......
synchronous.py
import pika
class Publisher(object):
......
class Consumer(object):
......
Это автоматически выберет второй, когда первый не установлен.
Есть ли лучший способ реализовать что-то подобное? Если бы кто-нибудь мог связать библиотеку / адаптер с похожей реализацией, это также было бы полезно.
[Редактировать]
Какой самый чистый способ реализовать что-то подобное? В будущем я также хотел бы иметь возможность изменить настройки по умолчанию. В конечном счете, я могу просто согласиться на использование установленной библиотеки, поскольку я могу это контролировать, но это было бы неплохо иметь.
Предложение Александерса интересно, но хотелось бы узнать, есть ли более чистый путь.
[Edit2]
Исходный пример был упрощен. Каждый модуль может содержать несколько типов импорта, например, Потребитель и Издатель.