gpt4 book ai didi

python - 在 python 应用程序中混合和匹配组件的最佳方式

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:27 25 4
gpt4 key购买 nike

我有一个组件,它使用我作为消息队列编写的简单发布/订阅模块。我想尝试其他实现,如 RabbitMQ。但是,我想让这个后端更改可配置,这样我就可以在我的实现和第 3 方模块之间切换,以进行清洁和测试。

显而易见的答案似乎是:

  1. 读取配置文件
  2. 创建一个可修改的设置对象/dict
  3. 修改目标组件以延迟加载指定的实现。

类似的东西:

# component.py
from test.queues import Queue

class Component:

def __init__(self, Queue=Queue):
self.queue = Queue()

def publish(self, message):
self.queue.publish(message)

# queues.py
import test.settings as settings

def Queue(*args, **kwargs):
klass = settings.get('queue')
return klass(*args, **kwargs)

不确定 init 是否应该接受 Queue 类,我认为这有助于轻松指定测试时使用的队列。

我的另一个想法是 http://www.voidspace.org.uk/python/mock/patch.html虽然这看起来会变得困惑。好处是我不必修改代码来支持交换组件。

任何其他想法或轶事将不胜感激。

编辑:固定缩进。

最佳答案

我之前做过的一件事是创建一个公共(public)类,每个特定的实现都从该类继承。然后是一个可以轻松遵循的规范,并且每个实现都可以避免重复他们将共享的某些代码。

这是一个糟糕的例子,但您可以看到如何使保护程序对象使用任何指定的类,而您的代码的其余部分不会在意。

class SaverTemplate(object):
def __init__(self, name, obj):
self.name = name
self.obj = obj

def save(self):
raise NotImplementedError


import json
class JsonSaver(SaverTemplate):
def save(self):
file = open(self.name + '.json', 'wb')
json.dump(self.object, file)
file.close()

import cPickle
class PickleSaver(SaverTemplate):
def save(self):
file = open(self.name + '.pickle', 'wb')
cPickle.dump(self.object, file, protocol=cPickle.HIGHEST_PROTOCOL)
file.close()

import yaml
class PickleSaver(SaverTemplate):
def save(self):
file = open(self.name + '.yaml', 'wb')
yaml.dump(self.object, file)
file.close()


saver = PickleSaver('whatever', foo)
saver.save()

关于python - 在 python 应用程序中混合和匹配组件的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com