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

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

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

我有一个返回数据列表和下一页 URL 的 API。当分页用完时,下一页 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 调用 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 表示不成功,即 res.status_code < 400 响应)

不确定它是否“更好”,但如果您要重复使用 fetch_paged 可能功能很多

注意:许多其他 API 将此 next_page_uri进入 standard ways 中的响应头哪个requests库知道如何通过 res.links 处理和公开属性

关于python - 如何将 iter() 应用于分页 api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53905012/

相关文章:

使用 itertools.combinations 生成对时出现 Python 内存错误

python - matplotlib 如何填充_between 步骤函数

python - 在多个装饰器之间传递参数

python - 如何在 Windows 上用 Python (3) 读取/写入文件而不引入回车符?

javascript - bokeh - 获取事件图例项目的列表

redis - Redis Multi哨兵失败后不选举新的Redis主机

python - apply_async 回调函数未被调用

python - 记录日期格式错误地将 │ 表示为 ¦

C++ 链表 - 使用哨兵从文件中读取数据

authentication - Laravel 5 哨兵 : How can disable "activation" and "throttle" checkpoints?