【问题标题】:Best way to mix and match components in a python app在 python 应用程序中混合和匹配组件的最佳方法
【发布时间】:2011-06-23 00:25:32
【问题描述】:

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

显而易见的答案似乎是:

  1. 读取配置文件
  2. 创建可修改的设置对象/字典
  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,尽管它看起来会变得一团糟。好处是我不必修改代码来支持交换组件。

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

编辑:固定缩进。

【问题讨论】:

  • 请修正代码的缩进。

标签: python architecture composition


【解决方案1】:

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

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

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()

【讨论】:

  • 我明白你在说什么。如果要将 Saver 添加到组件并在 Json、PickleSaver 和 YamlSaver 之间切换怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2022-01-04
  • 2013-04-27
  • 1970-01-01
  • 2022-08-24
  • 2019-03-21
  • 2016-12-14
相关资源
最近更新 更多