ean*_*son 9 python module adapter libraries python-2.7
我正在设计一个具有支持各种库的适配器的库.我希望库在导入特定类时动态选择哪个适配器具有在机器上安装的库.
目标是能够更改程序所依赖的库,而无需对代码进行修改.这个特殊功能用于处理RabbitMQ连接,因为我们遇到了很多关于鼠兔的问题,我们希望能够更改到不同的库,例如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
Run Code Online (Sandbox Code Playgroud)
然后当用户导入库时
from servicelibrary.simple import Publisher
Run Code Online (Sandbox Code Playgroud)
底层看起来像这样
alternative.py
import amqp
class Publisher(object):
......
class Consumer(object):
......
Run Code Online (Sandbox Code Playgroud)
synchronous.py
import pika
class Publisher(object):
......
class Consumer(object):
......
Run Code Online (Sandbox Code Playgroud)
当未安装第一个时,这将自动选择第二个.
是否有更好的方法来实现这样的事情?如果有人可以将库/适配器链接到类似的实现,这也是有用的.
[编辑]
实现这样的事最简洁的方法是什么?在将来,我还希望能够更改默认首选项.最终我可能只是满足于使用安装的库,因为我可以控制它,但它将是一个很好的功能.
Alexanders的建议很有意思,但我想知道是否有更清洁的方式.
[EDIT2]
最初的例子被简化了.每个模块可能包含多种类型的导入,例如Consumer和Publisher.
importlib.import_module可能会满足您的需要:
INSTALLED = ['syncronous', 'alternative']
for mod_name in INSTALLED:
try:
module = importlib.import_module('servicelibrary.simple.' + mod_name)
Publisher = getattr(module, 'Publisher')
if Publisher:
break # found, what we needed
except ImportError:
continue
Run Code Online (Sandbox Code Playgroud)
我想,这不是最先进的技术,但思路应该很清晰。您还可以查看imp模块。
归档时间: |
|
查看次数: |
357 次 |
最近记录: |