首页 > 解决方案 > Python结合了多个相似的功能

问题描述

我正在使用一个 API 来使用 python 拉回数据。我的功能工作正常,但我觉得我一遍又一遍地重复自己,我可能应该做一些事情来提高效率。

每个人所做的是获取结果的数量,然后返回 api 以返回确切的记录数量。

第一个功能:

def get_categories():
    headers = {"Authorization": "Bearer " + access_token} # auth plus token
    response = requests.get("https://api.destination.com/categories", headers=headers) # response
    data = json.loads(response.text) # load the json data
    records = str(data['totalResults']) # get number of results for next call
    response = requests.get("https://api.destination.com/categories?$skip=0&$top="+records, headers=headers)
    all_data = json.loads(response.text) # load the json data
    list_of_dict = all_data['resources'] # get rid of all but lists of dictionaries
    df = pd.DataFrame.from_records(list_of_dict) # create dataframe
    df['links'] = df['links'].str[0].str['href'] # just grab the links(key) items
    return df # return the final dataframe

第二个功能:

def get_groups():
    headers = {"Authorization": "Bearer " + access_token} # auth plus token
    response = requests.get("https://api.destination.com/groups", headers=headers) # response
    data = json.loads(response.text) # load the json data
    records = str(data['totalResults']) # get number of results
    response = requests.get("https://api.destination.com/groups?$skip=0&$top="+records, headers=headers)
    all_data = json.loads(response.text) # load the json data
    list_of_dict = all_data['resources']  # get rid of all but lists of dictionaries
    df = pd.DataFrame.from_records(list_of_dict) # create dataframe
    df['links'] = df['links'].str[0].str['href'] # just grab the links(key) items
    return df # return the final dataframe

还有3个类似的功能users做同样的事情。如您所见,它们之间的唯一区别是getlike https://api.destination.com/categoriesvshttps://api.destination.com/groups并且number of records每个返回的结果都会不同。有没有办法将这些结合起来并以某种方式称呼它?

标签: pythonpython-3.x

解决方案


看起来您已经知道如何制作函数,只需将其进一步扩展以抽象出函数中常见的所有内容。

BASE_URL = "https://api.destination.com/{}"

def make_headers():
    headers = {"Authorization": "Bearer " + access_token}
    return headers

def make_params(recs):
    params = {'$skip': 0, '$top': recs}
    return params

def make_df(data):
    list_of_dict = data['resources']
    df = pd.DataFrame.from_records(list_of_dict)
    df['links'] = df['links'].str[0].str['href']
    return df

def process(process):
    headers = make_headers()
    url = BASE_URL.format(process)
    resp = requests.get(url, headers=headers)
    data = resp.json()
    records = data['totalResults']

    params = make_params(records)
    resp = requests.get(url, headers=headers, params=params)
    all_data = resp.json()
    return make_df(all_data)

然后你可以像下面这样调用它:

process('groups')
process('categories')

你可以进一步分解它,但你明白了。


推荐阅读