Wählen Sie den Adapter dynamisch abhängig von den installierten Bibliotheken

Ich entwerfe eine Bibliothek mit Adaptern, die eine Vielzahl von Bibliotheken unterstützen. Ich möchte, dass die Bibliothek dynamisch auswählt, auf welchem ​​Adapter die verwendete Bibliothek beim Importieren bestimmter Klassen auf dem Computer installiert ist.

Ziel ist es, die Bibliothek, von der das Programm abhängig ist, ändern zu können, ohne Änderungen am Code vornehmen zu müssen. Diese spezielle Funktion ist für die Handhabung von RabbitMQ-Verbindungen gedacht, da wir mit vielen Problemen zu kämpfen hattenpikamöchten wir in der Lage sein, zu einer anderen Bibliothek zu wechseln, z.pyAMPQ oderHase ohne den zugrunde liegenden Code ändern zu müssen.

Ich habe darüber nachgedacht, so etwas in der zu implementieren__init__.py Datei vonservicelibrary.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

Dann, wenn der Benutzer die Bibliothek importiert

from servicelibrary.simple import Publisher

Die darunterliegende Ebene sieht ungefähr so ​​aus

alternative.py

import amqp

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

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

synchronous.py

import pika

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

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

Dies würde automatisch die zweite auswählen, wenn die erste nicht installiert ist.

Gibt es eine bessere Möglichkeit, so etwas umzusetzen? Wenn jemand eine Bibliothek / einen Adapter mit einer ähnlichen Implementierung verknüpfen könnte, wäre dies ebenfalls hilfreich.

[Bearbeiten]

Was wäre der sauberste Weg, so etwas umzusetzen? In Zukunft möchte ich auch die Standardeinstellung ändern können. Letztendlich kann ich mich nur damit zufrieden geben, die installierte Bibliothek zu verwenden, da ich das steuern kann, aber es wäre eine nette Funktion.

Alexanders Vorschlag ist interessant, aber ich würde gerne wissen, ob es einen saubereren Weg gibt.

[Edit2]

Das ursprüngliche Beispiel wurde vereinfacht. Jedes Modul kann mehrere Arten von Importen enthalten, z. Verbraucher und Verleger.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage