在迭代时是否有扩展迭代器的方法。
我想遍历请求,以防它们超时,我想拆分请求并将其添加到运行循环中。
类似这样的东西:
l = [1, 2, 3, 4, 5]
it = iter(l)
for e in it:
try:
request(e)
except Exception:
it.append(split_request(e))
但是append
不起作用,itertools.chain
返回一个新的迭代器,而不是就地更改迭代器。
答案 0 :(得分:2)
您需要一个while
循环。在其中,遍历列表并累积失败条目的列表。当该列表为空时,while
循环可以终止。像这样:
while l:
failures = []
for e in l:
try:
request(e)
except Exception:
failures.append(split_request(e))
l = failures
应该这样做。
答案 1 :(得分:1)
您只需要一个while循环并处理索引并自己迭代
l = [1, 2, 3, 4, 5]
i = 0
while i < len(l):
try:
request(l[i])
i += 1
except Exception:
l[i] = split_request(l[i])
答案 2 :(得分:1)
下面的代码两次尝试每个列表,并输出一个字典,该字典的值导致错误和尝试次数。您可以将errors
列为列表,如果len(errors)
太大则停止附加。
import itertools
l = [-2, -1, 0, 1, 'a', 2]
it = iter(l)
errors = {}
for e in itertools.chain(it, errors):
try:
print('e =', e, ' 1/e = ', end=' ')
print(1/e) <---- May Fail
except Exception:
errors[e] = errors.get(e, 0) + 1
print('Error')
print('errors', errors)
O / P
e = -2 1/e = -0.5
e = -1 1/e = -1.0
e = 0 1/e = Error
e = 1 1/e = 1.0
e = a 1/e = Error
e = 2 1/e = 0.5
e = 0 1/e = Error
e = a 1/e = Error
>>> print('errors', errors)
errors {0: 2, 'a': 2}