[英]Chaining Iterators inplace
有沒有辦法在迭代時擴展迭代器。
我想遍歷請求,以防萬一超時,我想拆分請求並將其添加到運行循環中。
像這樣:
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
返回一個新的迭代器,而不是就地更改迭代器。
您需要一個while
循環。 在其中,遍歷列表並累積失敗條目的列表。 當該列表為空時, while
循環可以終止。 就像是:
while l:
failures = []
for e in l:
try:
request(e)
except Exception:
failures.append(split_request(e))
l = failures
應該這樣做。
您只需要一個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])
下面的代碼兩次嘗試每個列表兩次,並輸出一個字典,該字典的值導致錯誤和嘗試次數。 如果len(errors)
太大,則可能使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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.