我正在点击一个API,其响应包含许多页面,例如100。
这需要太长时间,因此我尝试使用generators
,因此我可以为每个页面和流程yield
值,直到管道中遇到一些condition
。
import requests
import json
import itertools as it
我定义了这个generator
来提出请求:
def api_query(query):
page=1
while True:
# do requests, then
for result in body:
title = result["result"]["title"]
primaryartist_name = result["result"]["primary_artist"]["name"]
yield title, primaryartist_name
page+=1
然后,我想使用另一个generator
:
def api_filter():
api_response = api_query('query')
# 10 first results
page1 = [api_response.next() for i in range(10)]
# do some filtering with page1 results
yield results
最后,我为condition
测试了它,并尝试return
我想要的值:
def api_print():
results = api_filter()
page1 = list(it.islice(results, 5))
# check if page1 results satisfy a given condition
if condition:
return page1
# or try next page
else:
page2 = list(it.islice(results.next(), 5))
return page2
但是,在最后一段代码中,我只能打印page1;如果代码移到else
,我会得到
page2 = list(it.islice(results.next(), 5)) StopIteration
我做错了什么?
ps:对不起,如果这是一个非工作的例子;完整的代码太长了,所以我使用一个简化的问题来测试这种情况下的生成器的概念...