如何将 iter() 应用于分页 api?
How can I apply iter() to a pagination api?
我看了 Raymond Hettinger 的 Idiomatic Python talk, and learned about the sentinel argument 到 iter()
。
我想尝试将它应用到我正在迭代使用分页的 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
我看了 Raymond Hettinger 的 Idiomatic Python talk, and learned about the sentinel argument 到 iter()
。
我想尝试将它应用到我正在迭代使用分页的 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
属性