python – 如何将iter()应用于分页API?

我观看了Raymond Hettinger的
Idiomatic Python演讲,并了解了
sentinel argument to iter().

 我想尝试将它应用于一段代码,我正在迭代使用分页的API(它是Twilio,但与我的问题无关).

我有一个返回的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循环,并使用next_page_uri值作为sentinel参数调用iter()替换它.
或者,这可以用收益率来写吗?

最佳答案 我想这可能就是你的意思……但正如评论中所述,它没有多大帮助:

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(),这会引发非成功,即res.status_code< 400,响应) 不确定它是否“更好”,但可能是你要重新使用fetch_paged功能 注意:许多其他API将此next_page_uri放入standard ways中的响应头中,请求库知道如何通过res.links属性处理和公开

点赞