【发布时间】:2013-10-23 11:32:54
【问题描述】:
我正在设计一个库,它具有支持各种库的适配器。我希望库在导入特定类时动态选择在机器上安装了它使用的库的适配器。
目标是能够更改程序所依赖的库,而无需修改代码。这个特殊功能用于处理 RabbitMQ 连接,因为我们在pika 上遇到了很多问题,我们希望能够更改为不同的库,例如pyAMPQ 或 rabbitpy 无需更改底层代码。
我正在考虑在servicelibrary.simple 的__init__.py 文件中实现类似的东西。
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
底层看起来像这样
alternative.py
import amqp
class Publisher(object):
......
class Consumer(object):
......
同步.py
import pika
class Publisher(object):
......
class Consumer(object):
......
当第一个没有安装时,这会自动选择第二个。
有没有更好的方法来实现这样的事情?如果有人可以将库/适配器与类似的实现链接起来,那也会很有帮助。
[编辑]
实现这样的东西最干净的方法是什么?将来我还希望能够更改默认首选项。最终我可能会满足于使用安装的库,因为我可以控制它,但它会是一个很好的功能。
Alexanders 的建议很有趣,但我想知道是否有更清洁的方法。
[编辑2]
原始示例已简化。每个模块可能包含多种类型的导入,例如消费者和发布者。
【问题讨论】:
-
查看一个组件架构,例如 zope.component。
标签: python python-2.7 module adapter libraries