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

时间:2018-12-23 15:51:38

标签: python python-3.x sentinel yield-from

我观看了Raymond Hettinger的Idiomatic Python谈话,并了解了sentinel argumentiter()的情况。  我想尝试将其应用于正在迭代使用分页的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来写吗?

1 个答案:

答案 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>