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

2024-06-01 01:44:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我看了雷蒙德·赫廷格的Idiomatic Python演讲,了解了sentinel argumentiter()。 我想尝试将它应用到一段代码中,我正在迭代使用分页的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()调用来替换它。 或者,这可以用yield from来写吗?你知道吗


Tags: 代码apiurldatapageuriargumentsentinel
1条回答
网友
1楼 · 发布于 2024-06-01 01:44:35

我认为这可能是你的意思…但正如评论中所说,这并没有多大帮助:

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库知道如何处理并通过^{}属性公开

相关问题 更多 >