Wybierz adapter dynamicznie w zależności od zainstalowanych bibliotek

Projektuję bibliotekę z adapterami obsługującymi szeroką gamę bibliotek. Chcę, aby biblioteka dynamicznie wybierała adapter, który ma bibliotekę, której używa, zainstalowaną na komputerze podczas importowania określonych klas.

Celem jest możliwość zmiany biblioteki, od której zależy program, bez konieczności modyfikowania kodu. Ta szczególna funkcja służy do obsługi połączeń RabbitMQ, ponieważ mieliśmy wiele problemówpika, chcemy mieć możliwość zmiany biblioteki, np.pyAMPQ lubkrólika bez konieczności zmiany kodu źródłowego.

Myślałem o wdrożeniu czegoś takiego w__init__.py plik zservicelibrary.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

Następnie, gdy użytkownik importuje bibliotekę

from servicelibrary.simple import Publisher

Podstawowa warstwa wygląda mniej więcej tak

alternative.py

import amqp

class Publisher(object):
    ......

class Consumer(object):
     ......    

synchronous.py

import pika

class Publisher(object):
    ......

class Consumer(object):
     ......   

Spowoduje to automatyczne wybranie drugiego, gdy pierwszy nie zostanie zainstalowany.

Czy istnieje lepszy sposób na wdrożenie czegoś takiego? Jeśli ktoś mógłby połączyć bibliotekę / adapter z podobną implementacją, która byłaby również pomocna.

[Edytować]

Jaki byłby najczystszy sposób na wdrożenie czegoś takiego? W przyszłości chciałbym również móc zmienić domyślne preferencje. Ostatecznie mogę po prostu zadowolić się używaniem zainstalowanej biblioteki, ponieważ mogę to kontrolować, ale byłoby miło mieć ją.

Sugestia Alexandersa jest interesująca, ale chciałbym wiedzieć, czy istnieje bardziej przejrzysty sposób.

[Edit2]

Oryginalny przykład został uproszczony. Każdy moduł może zawierać wiele typów importu, np. Konsument i wydawca.

questionAnswers(5)

yourAnswerToTheQuestion