Sto progettando una libreria che abbia adattatori che supportano una vasta gamma di librerie. Voglio che la libreria scelga dinamicamente quale adattatore abbia la libreria che usa installata sulla macchina durante l'importazione di classi specifiche.Scegliere l'adattatore dinamicamente in base alle librerie installate
L'obiettivo è essere in grado di modificare la libreria da cui dipende il programma senza dover apportare modifiche al codice. Questa particolare caratteristica è per la gestione delle connessioni RabbitMQ, in quanto abbiamo avuto un sacco di problemi con pika, vogliamo essere in grado di passare a una libreria diversa, ad es. pyAMPQ o rabbitpy senza dover modificare il codice sottostante.
Stavo pensando di implementare qualcosa di simile nel file __init__.py
di 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
Poi, quando l'utente importa la libreria
from servicelibrary.simple import Publisher
Lo strato sottostante sembra qualcosa di simile
alternative.py
import amqp
class Publisher(object):
......
class Consumer(object):
......
synchronous.py
import pika
class Publisher(object):
......
class Consumer(object):
......
Questo selezionerebbe automaticamente il secondo quando il primo non è installato.
Esiste un modo migliore per implementare qualcosa di simile? Se qualcuno potesse collegare una libreria/adattatore con un'implementazione simile sarebbe utile pure.
[Edit]
Quale sarebbe il modo più pulito di implementare qualcosa di simile? In futuro mi piacerebbe anche essere in grado di modificare la preferenza predefinita. In definitiva potrei accontentarmi di usare la libreria installata, dato che posso controllarla, ma sarebbe una bella funzionalità.
La proposta di Alexanders è interessante, ma mi piacerebbe sapere se c'è un modo più pulito.
[Edit2]
L'esempio originale è stata semplificata. Ogni modulo può contenere più tipi di importazioni, ad es. Consumatore e editore.
Esaminare un'architettura di componenti, ad esempio zope.component, ad esempio. –