我正在设计一个具有支持各种库的适配器的库。我希望库在导入特定类时动态选择在机器上安装了它使用的库的适配器。
目标是能够更改程序所依赖的库,而无需修改代码。这个特殊功能用于处理 RabbitMQ 连接,因为我们在使用pika时遇到了很多问题,我们希望能够更改为不同的库,例如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
底层看起来像这样
替代.py
import amqp
class Publisher(object):
......
class Consumer(object):
......
同步的.py
import pika
class Publisher(object):
......
class Consumer(object):
......
当第一个未安装时,这将自动选择第二个。
有没有更好的方法来实现这样的事情?如果有人可以将库/适配器与类似的实现链接起来,那也会很有帮助。
[编辑]
实现这样的事情的最干净的方法是什么?将来我还希望能够更改默认首选项。最终我可能会满足于使用安装的库,因为我可以控制它,但它会是一个很好的功能。
亚历山大的建议很有趣,但我想知道是否有更清洁的方法。
[编辑2]
原始示例已简化。每个模块可能包含多种类型的导入,例如 Consumer 和 Publisher。