我观看了Raymond Hettinger的Idiomatic Python谈话,并了解了sentinel argument至iter()
的情况。
我想尝试将其应用于正在迭代使用分页的API的一段代码(这是Twilio,但与我的问题无关)。
我有一个API,该API返回:数据列表和下一页URL。分页用完后,下一页URL将返回为空字符串。我将提取函数编写为生成器,看起来大致像这样:
def fetch(url):
while url:
data = requests.get(url).json()
url = data['next_page_uri']
for row in data[resource]:
yield row
这段代码可以正常工作,但是我想尝试删除while
循环,并使用iter()
值作为哨兵参数来调用next_page_uri
来替换它。
或者,可以用yield from
来写吗?
答案 0 :(得分:1)
我认为这可能是您的意思……但是,正如评论中所述,这并没有太大帮助:
def fetch_paged(url):
while url:
res = requests.get(url)
res.raise_for_status()
data = res.json()
yield data
url = data['next_page_uri']
def fetch(url):
for data in fetch_paged(url):
yield from data[resource]
(我已借此机会致电raise_for_status()
,如果没有成功,即raise
,将回复res.status_code < 400
)
不确定是否有更好的方法,但是可能您是否会大量重复使用fetch_paged
功能
注意:许多其他API将此next_page_uri
放入standard ways的响应头中,requests
库知道如何处理并通过res.links
属性公开< / p>