我正在处理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()
嗨卡尔 - 批次需要能够包括不同的命令 - create_vertex,create_edge,index_vertex。我会看看在客户端上设置批处理模式。 – espeed 2012-03-06 18:51:47
是的,我可以继承客户端来制作BatchClient,并让它将命令添加到批处理列表中,而不是立即发送每个请求。 – espeed 2012-03-06 19:04:31