我正在将API合并到一个类中,并且我已将所有各种端点都转换为函数。我有一个基类,它创建一个机械化浏览器对象。每个函数我重复了很多相同的数据,我编码并在我的帖子请求中发送。我不想为每个功能制作一本字典。有人可以给我一些建议如何简化这个吗?
以下是我正在谈论的一个示例:
def make_url(host='api.funsite.com/', scheme='https'):
return '%s://%s' % (scheme, host)
def make_post(br, data):
print make_url()+'&'+urlencode(data)
raw = br.open(make_url(), urlencode(data))
return raw
class ParkLogicAPI(BaseAPI):
def __init__(self, accountId, token, client):
super(ParkLogicAPI, self).__init__()
self.accountId = accountId
self.token = token
self.client = client
def getDailyDataFinal(self, startDate, endDate, display='screen', format='csv'):
data = {'accountId': self.accountId,
'client': self.client,
'token': self.token,
'class': 'CustomerReports',
'method': 'getDailyDataFinal',
'startDate': startDate,
'endDate': endDate,
'display': display,
'format': format}
resp = make_post(self.browser, data)
return resp
def getDailyDataEstimates(self, startDate, endDate, display='screen', format='csv'):
data = {'accountId': self.accountId,
'client': self.client,
'token': self.token,
'class': 'CustomerReports',
'method': 'getDailyDataEstimates',
'startDate': startDate,
'endDate': endDate,
'display': display,
'format': format}
resp = make_post(self.browser, data)
return resp
def getDomainDailyDataFinal(self, date, display='screen', format='csv'):
data = {'accountId': self.accountId,
'client': self.client,
'token': self.token,
'class': 'CustomerReports',
'method': 'getDomainDailyDataFinal',
'date': date,
'display': display,
'format': format}
resp = make_post(self.browser, data)
return resp
答案 0 :(得分:2)
将基础数据抽象到自己的方法中,然后根据需要使用附加方法调用它,如下所示:
def getBaseData(self, **kwargs):
data = {'accountId': self.accountId,
'client': self.client,
'token': self.token,
'class': 'CustomerReports',
'display': display,
'format': format}
data.update(kwargs)
resp = make_post(self.browser, data)
return resp
def getDailyDataEstimates(self, startDate, endDate, display='screen', format='csv'):
return self.getBaseData(startDate=startDate, endDate=endDate,
method='getDailyDataEstimates',
display='screen', format='csv')
因为这会将关键字参数(aka。**kwargs
)合并到data
数组中,所以这可以通用化,因此任何数据都可以轻松地插入到字典中,例如:
def getMonthlyDataEstimates(self, startDate, endDate, display='screen', format='csv'):
return self.getBaseData(month=getMonth(statrtDate)
method='getMonthlyDataEstimates',
display='screen', format='csv')
答案 1 :(得分:1)
创建一个创建dict其余部分的方法;然后调用它并插入特定于您正在进行的API调用的内容。
def _basic_data(self, display='screen', format='csv'):
return {'accountId': self.accountId,
'client': self.client,
'token': self.token,
'class': 'CustomerReports',
'display': display,
'format': format}
# and then, for example:
def get_domain_daily_data_final(self, date, display='screen', format='csv'):
data = self._basic_data(display=display, format=format)
data['method'] = 'getDomainDailyDataFinal'
data['date'] = date
return make_post(self.browser, data)
另一种不同的方法是期望调用代码将API方法的名称(以及该调用所需的任何其他内容)提供给单个Python方法。在这种情况下,我们可以使用关键字参数来处理给定调用可能需要的任何其他内容(例如date
vs startDate
+ endDate
);但是,我们无法以这种方式进行验证。它看起来像是:
def make_api_call(self, method, display='screen', format='csv', **kwargs):
data = {'accountId': self.accountId,
'client': self.client,
'token': self.token,
'class': 'CustomerReports',
'method': method,
'display': display,
'format': format}
data.update(kwargs)
return make_post(self.browser, data)
然后我们可以调用instance.make_api_call('getDomainDailyDataFinal', date=date)
。