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.