【问题标题】:How to pass a list of values, dynamically, as multiple Python requests parameters?如何将值列表作为多个 Python 请求参数动态传递?
【发布时间】:2020-11-03 06:55:45
【问题描述】:

我是 Python 新手。尝试使用 Python requests 模块自动执行一些痛苦的 API 调用。非常接近,但无法弄清楚如何将时间戳列表传递为request parameters

示例:生成lastModified时间戳列表

import datetime
from datetime import datetime, timedelta

earliest_ts_str = '2020-10-01T15:00:00Z'
earliest_ts_obj = datetime.strptime(earliest_ts_str, timestamp_format)

#bottom_ts_obj = earliest_ts_obj.replace(second=0, microsecond=0, minute=0)

latest_ts_str = '2020-10-01T23:00:00Z'
latest_ts_obj = datetime.strptime(latest_ts_str, timestamp_format)

ts_raw = []
while earliest_ts_obj < latest_ts_obj:
    ts_raw.append(earliest_ts_obj)
    earliest_ts_obj += timedelta(hours=1)

ts_raw.append(latest_ts_obj)

ts_formatted = [d.strftime('%Y-%m-%dT%H:%M:%SZ') for d in ts_raw]
ts_formatted

结果:

['2020-10-01T15:00:00Z',
 '2020-10-01T16:00:00Z',
 '2020-10-01T17:00:00Z',
 '2020-10-01T18:00:00Z',
 '2020-10-01T19:00:00Z',
 '2020-10-01T20:00:00Z',
 '2020-10-01T21:00:00Z',
 '2020-10-01T22:00:00Z',
 '2020-10-01T23:00:00Z']

示例 2: 创建 request 调用

  • 这是(显然)我的问题所在。我试图充实一个函数来处理它,但它甚至没有关闭!
  • 如何将列表中的第一个时间戳作为lastModifiedStart 参数传递? AND
  • 将列表中的第二个时间戳作为lastModifiedEnd 参数传递?
  • 然后以此类推,直到尝试了所有时间戳?
import requests

method = 'get'
base_url = 'https://sandbox-api.com/'
api_type = 'items'
api_version = '/v1/'
api_path = api_type + api_version

api_key = 'myKey'

full_url = base_url + api_path

def make_historic_calls(last_mod_start, last_mod_end):
    last_mod_start = for ts in ts_formatted: ts
    last_mod_end = for ts in ts_formatted: ts
    parameters = {'api_key':api_key, 'lastModifiedStart': last_mod_start, 'lastModifiedEnd': last_mod_end}

    auth_header = {'Authorization': 'Basic <base64EncodedStringHere>'}

    resp_raw = requests.request(method, full_url, headers=auth_header, params=parameters)

    resp_processed = json.loads(resp_raw.content)

    resp_pretty = json.dumps(resp_processed, indent=2, sort_keys=True)

    return print(pretty)

test = make_historic_calls(ts_formatted, ts_formatted)

我知道这不是一个简单的解决方案(我花了好几天的时间才走到这一步),但是任何关于如何解决这个问题的指导都将不胜感激。

谢谢

编辑 1:这个调整后的功能效果很好!

def make_historic_calls(ts_formatted):
    for last_mod_start, last_mod_end in zip(ts_formatted, ts_formatted[1:]):
        parameters = {'api_key':api_key, 'lastModifiedStart': last_mod_start, 'lastModifiedEnd': last_mod_end}

        auth_header = {'Authorization': 'Basic <base64EncodedString>'}

        resp_raw = requests.request(method, full_url, headers=auth_header, params=parameters)

        print(f'{resp_raw.url} Status Code: {str(resp_raw.status_code)}')

    return print(resp_raw)

test = make_historic_calls(ts_formatted)

【问题讨论】:

    标签: python list python-requests http-request-parameters


    【解决方案1】:

    从列表中提取连续项目对的标准技巧是:

    for this_one, next_one in zip(my_list, my_list[1:]):
       ...
    

    所以你的代码需要是这样的:

    def make_historic_calls(ts_formatted):
        for last_mod_start, last_mod_end in zip(ts_formatted, ts_formatted[1:]):
            make the request using last_mod_start and last_mod_end
        return some value combining all of the results from your requests
    
    
    make_historic_calls(ts_formatted)
    

    我希望我已经正确理解了你想要做什么。

    【讨论】:

    • 这完全有效!谢谢@FrankYellin。天!男人天!我一直在努力解决这个问题……松了一口气。
    【解决方案2】:

    所以基本上你想要做的是将列表按 2 个元素分块,然后解包这 2 个元素列表并将它们传递给函数,考虑类似于以下生成器:

    
    
    def chunks(l, n):
        """Yield successive n-sized chunks from l."""
        for i in range(0, len(l), n):
            yield l[i:i + n]
    
    

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

    for first, second in chunks(iterable, 2):
        make_historic_calls(first, second)
    
    

    希望对你有帮助

    编辑: 我不确定您是否要通过重叠或不重叠的对传递变量,如果您希望它们像 (0,1) (1,2) (2,3)... 而不是 (0 ,1) (2,3) (4,5)...然后使用下面的“块”版本:

    def chunks(l, n, repeat=True):
        """Yield successive n-sized chunks from l."""
        for i in range(0, len(l), n):
            additional = int(repeat)
            yield l[i:i + n + additional]
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2011-01-20
      • 2020-02-25
      • 1970-01-01
      • 2021-11-08
      相关资源
      最近更新 更多