2011-02-07 4 views
4

메시지 큐로 작성한 간단한 pub/sub 모듈을 사용하는 구성 요소가 있습니다. 나는 RabbitMQ와 같은 다른 구현을 시도하고 싶다. 그러나이 백엔드 변경을 구성 가능하게 만들고 구현 및 타사 모듈간에 청결과 테스트를 전환 할 수 있습니다.파이썬 응용 프로그램에서 구성 요소를 혼합하고 일치시키는 가장 좋은 방법

확실한 대답을 것 같다 :

  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) 

확실하지 경우, 나는 그것을에서 쉽게 테스트하는 동안 사용되는 큐를 지정 도움이 될 그림.

내가 가지고 있었던 또 다른 생각은 http://www.voidspace.org.uk/python/mock/patch.html와 같았다. 그러나 그것은 그것이 더러워 질 것 인 것처럼 느껴진다. Upside는 스와핑 구성 요소를 지원하도록 코드를 수정할 필요가 없다는 것입니다.

다른 아이디어 나 일화는 인정 될 것입니다.

편집 : 들여 쓰기가 고정되어 있습니다.

+0

코드의 들여 쓰기를 수정하십시오. – unholysampler

답변

2

내가 한 일은 각 특정 구현이 상속하는 공통 클래스를 만드는 것입니다. 그렇다면 쉽게 따라 할 수있는 스펙이 있으며 각 구현은 모두 공유 할 특정 코드를 반복하지 않을 수 있습니다.

이 예는 좋지 않지만 세이버 개체가 지정된 클래스를 사용하게하고 나머지 코드는 신경 쓸 필요가 없다는 것을 알 수 있습니다.

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

나는 당신이 말하는 것을 얻습니다. Saver를 구성 요소에 추가하고 Json, PickleSaver 및 YamlSaver간에 스왑 아웃하려면 어떻게해야합니까? –

관련 문제