Выберите адаптер динамически в зависимости от установленной библиотеки

Я проектирую библиотеку, которая имеет адаптеры, которые поддерживают широкий спектр библиотек. Я хочу, чтобы библиотека динамически выбирала, какой адаптер, на котором установлена библиотека, установлен на компьютере при импорте определенных классов.

Цель состоит в том, чтобы иметь возможность изменять библиотеку, от которой зависит программа, без необходимости вносить изменения в код. Эта особенность предназначена для обработки соединений 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]

Исходный пример был упрощен. Каждый модуль может содержать несколько типов импорта, например, Потребитель и Издатель.

Ответы на вопрос(5)

Ваш ответ на вопрос