2012-03-06 34 views
2

我正在处理REST客户端库,并且最近开始致力于添加对发送批处理消息的支持。如何合并两个包含具有相同签名的方法的Python类?

但是,我不喜欢现在的设计。它要求您维护具有相同方法签名的大型Client和RequestMessage类。

我正在寻找一种方法来巩固这两个类。

原来的客户端类的方法包含了所有的准备并发送请求所需的代码:

class Client(object): 

    def __init__(self, config): 
     self.request = Request(config, "application/json") 

    def create_vertex(self, data): 
     path = "vertices" 
     params = remove_null_values(data) 
     self.request.post(path, params) 

要添加批量消息的支持,我掏出了每个客户端方法里面的代码的胆量,和把它放入一个单独的RequestMessage类,以便您可以添加消息批而不发送,直到你准备:

class Client(object): 

    def __init__(self, config): 
     self.request = Request(config, "application/json") 
     self.message = RequestMessage(config) 

    def create_vertex(self, data): 
     message = self.message.create_vertex(data) 
     return self.request.send(message) 

    # ...more REST client methods... 

    def batch(self, messages): 
     path = "batch" 
     params = messages 
     return self.request.post(path, params)  

class RequestMessage(object): 

    def __init__(self, config): 
     self.config = config 

    def create_vertex(self, data): 
     path = "vertices" 
     params = remove_null_values(data) 
     return POST, path, params 

    # ...more REST client methods... 

但我不喜欢的设计,因为现在你必须保持客户端和RequestMessage类 - 两大类s具有相同的签名。

这里的批次类的样子:

class Batch(object): 

    def __init__(self, client): 
     self.client = client 
     self.messages = [] 

    def add(self, message): 
     self.messages.append(message) 

    def send(self): 
     return self.client.batch(self.messages) 

这里的例子使用了在服务器上创建一个顶点:

>>> client = Client(config) 
>>> vertex = client.create_vertex({'name':'James'}) 

下面是创建一个批处理服务器上顶点的用法示例:

>>> message1 = client.message.create_vertex({'name':'James'}) 
>>> message2 = client.message.create_vertex({'name':'Julie'}) 
>>> batch = Batch(client) 
>>> batch.add(message1) 
>>> batch.add(message2) 
>>> batch.send() 

批量使用的次数少于客户端,所以我想让no rmal客户端界面最容易使用。

这里有一个想法,但我不太清楚如何去实现它,或者别的东西会更好:

>>> vertex = client.create_vertex(data) 
    >>> message = client.create_vertex(data).message() 

回答

1

我个人的偏好是一个API,如:

client.create_vertex({'name':'James'}) # single 
client.create_vertex([{'name':'James'}, {'name':'Julie'}]) # batch 

那你使用完全相同的功能的方式,你只是给它更多的数据。典型的应用很可能就是看起来更像:

batch = [] 
batch.append({'name':'James'}) 
batch.append({'name':'Julie'}) 
client.create_vertex(batch) 
+0

嗨卡尔 - 批次需要能够包括不同的命令 - create_vertex,create_edge,index_vertex。我会看看在客户端上设置批处理模式。 – espeed 2012-03-06 18:51:47

+0

是的,我可以继承客户端来制作BatchClient,并让它将命令添加到批处理列表中,而不是立即发送每个请求。 – espeed 2012-03-06 19:04:31

1

我会@Karl同意一些修改

client.create_vertex({'name':'James'}) # single 
client.create_vertex({'name':'James'}, {'name':'Julie'}) # batch 

batch = [] 
batch.append({'name':'James'}) 
batch.append({'name':'Julie'}) 
client.create_vertex(*batch) 

这样,你就不必检查输入的类型。写起来更容易,更易于使用。

相关问题