在查询具有未知长度的分页列表的API时,我发现自己基本上在做
def fetch_one(self, n):
data = json.load(urlopen(url_template % n))
if data is None:
self.finished = True
return
for row in data:
if row_is_weird(row):
self.finished = True
return
yield prepare(row)
def work(self):
n = 1
self.finished = False
while not self.finished:
consume(self.fetch_one(n))
n += 1
Run Code Online (Sandbox Code Playgroud)
之间的分裂work,并fetch_one使得它很容易测试,但通过实例变量的信令意味着我不能有一个以上的work在同一时间,这吮吸回事.我提出了我认为更清洁的解决方案,但它涉及一个具有两个"完成"状态的迭代器,我不知道该怎么称呼它.我确定这种模式存在于其他地方,所以我很欣赏指针(或者为什么这是愚蠢的原因):
class Thing(object):
def __init__(self, gen):
self.gen = gen
self.finished = False
def __iter__(self):
return self
def __next__(self):
try:
v = next(self.gen)
except StopThisThing:
self.finished = True
raise StopIteration
else: …Run Code Online (Sandbox Code Playgroud)