【发布时间】:2019-05-23 02:52:49
【问题描述】:
我观看了 Raymond Hettinger 的 Idiomatic Python 谈话,并了解了 sentinel argument 至 iter()。
我想尝试将其应用于我正在迭代使用分页的 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 值作为标记参数的对 iter() 的调用。
或者,这可以写成yield from吗?
【问题讨论】:
-
您不能在值的部分上使用
iter。你可以编写一个适配器生成器,但它和你现在的一样复杂。 -
值得注意的是,python3.6 会针对函数的示例版本抛出警告。在我的实际代码中,
while循环的内部位于try-except to catchStopIteration`。 -
您希望它 yield 行直到
'next_page_uri'为空字符串?是否需要为每个next_page.发出新请求? -
是的,正如目前所写,它每次耗尽
data[resource]时都会发出一个新请求,然后继续从下一个request.get产生额外的行。 -
@Sethish:这里有什么可以提高
StopIteration?
标签: python python-3.x sentinel yield-from