许多相似的方法vs一个方法有许多参数?



我很难决定如何编写下面的客户端:

import requests
  1. 方法依赖:
class Client:
def request_endpoint_1(self, **params):
return requests.get('url_1', params)
def request_endpoint_2(self, **params):
return requests.get('url_2', params)

def request_endpoint_3(self, **params):
return requests.get('url_3', params)
.
.
.
  1. 参数依赖:
from enum import Enum

class Endpoint(Enum):
endpoint_1 = 'url_1'
endpoint_2 = 'url_2'
endpoint_3 = 'url_3'
.
.
.

class Client:
def request(self, endpoint: Endpoint, **params):
return requests.get(endpoint.value, params)

考虑到端点计数非常高(100+),第二个选项似乎是一个更好的选择,因为它重复的次数要少得多,我猜枚举的内存分配也少于第一个选项中相同数量的实例方法。

但是如果我选择选项1,这使得它对ide友好,并且使用Client方法编写代码更简单。对于选项2,用户还必须导入Endpoint(Enum)类,该类将位于与Client不同的模块中。

问题是我应该使用哪一个,为什么?我还想知道两者之间是否有相当大的内存效率差异。

一个好的API应该是通过阅读方法签名来解释的,你的问题中的两种方法都不能很好地了解每个端点期望和返回的内容,即参数和返回值。

为每个端点编写一个方法,并使用正确命名和类型的参数,这样会清晰得多。每个方法还应该返回适合调用性质的数据类型的值,而不是通用的Response对象。在初始化客户端对象时,还将公共参数存储为实例属性。

所以要回答这个问题的标题"许多相似的方法vs一个接受许多参数的方法",我想说更好的方法是写"许多不同的方法"。

例如(使用一些假想的存储API):

class Client:
def __init__(self, auth_key: str):
self.common_params = {'auth_key': auth_key}
def list_directory(self, path: str, recursive: bool = False) -> list[str]:
return [
file['name']
for file in requests.get('url_1', params={
'path': path,
'recursive': 'yes' if recursive else 'no',
**self.common_params
}).json()['files']
]
def copy_file(self, from_path: str, to_path: str) -> None:
requests.get('url_2', params={
'from_path': from_path,
'to_path': to_path,
**self.common_params
})

最新更新