python - 如何合并两个包含具有相同签名的方法的Python类?

标签 python api rest api-design

我正在开发一个 REST 客户端库,最近开始致力于添加对发送批量消息的支持。

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

我正在寻找一种方法来整合这两个类。

原始 Client 类的方法包含准备和发送请求所需的所有代码:

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)

为了添加对批处理消息的支持,我提取了每个 Client 方法内的代码的核心,并将其放入单独的 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...

但我不喜欢这种设计,因为现在您必须维护 Client 和 RequestMessage 类——两个具有相同签名的大类。

Batch 类如下所示:

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

Batch 的使用频率低于 Client,因此我想让普通的 Client 界面最易于使用。

这是一个想法,但我不太确定如何实现它,或者是否有其他更好的方法:

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

最佳答案

我个人更喜欢这样的 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)

关于python - 如何合并两个包含具有相同签名的方法的Python类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9586214/

相关文章:

python - 创建 Django 数据库

python - 如何使用libsvm中svm_model的 'predict'函数?

javascript - 基于 REST 响应的动态 HTML 部分

python - 在句子中正确使用a或an

python - 在 Django 中使用文本作为安全文本和 url

java - 如何在 Netbeans 中添加 SteelSeries javadoc?

rest - 测试基于 gin 的 REST API 在使用 net/http/httptest 时没有获取参数

php - GET 请求中的 ReSTler API Explorer 数组参数

javascript - Web 抓取需要使用/Javascript 警报进行身份验证的内部站点

没有 API 的 iOS 应用程序,替代品?