如何将 iter() 应用于分页 api?

How can I apply iter() to a pagination api?

我看了 Raymond Hettinger 的 Idiomatic Python talk, and learned about the sentinel argumentiter()。 我想尝试将它应用到我正在迭代使用分页的 API 的一段代码中(它是 Twilio,但与我的问题无关)。

我有一个 API returns:数据列表和下一页 URL。当分页用完时,下一页 URL returns 为空字符串。我把抓取函数写成了一个生成器,看起来大致是这样的:

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 值作为标记参数调用 iter() . 或者,这可以用 yield from 来写吗?

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

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 用于 non-successful,即 res.status_code < 400,响应)

不确定是否有任何 "better",但如果您要大量重复使用 fetch_paged 功能,则可能

注意:许多其他 API 将此 next_page_uri 放入 standard ways which the requests library knows how to deal with and exposes via the res.links 属性

中的响应 headers