删除python类中的重复词典

时间:2014-01-23 03:38:17

标签: python

我正在将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

2 个答案:

答案 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)

之类的内容