如何作为多个 Python 请求参数动态传递值列表?
How to pass a list of values, dynamically, as multiple Python requests parameters?
我是 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)
从列表中提取成对的连续项目的标准技巧是:
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)
希望我已经正确理解了您要执行的操作。
所以基本上你想要做的是将列表分成 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)... 然后使用下面的“chunks”版本:
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]
我是 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)
从列表中提取成对的连续项目的标准技巧是:
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)
希望我已经正确理解了您要执行的操作。
所以基本上你想要做的是将列表分成 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)... 然后使用下面的“chunks”版本:
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]