""" Call a function repeatedly until an exception is raised.
Converts a call-until-exception interface to an iterator interface.
- Like builtins.iter(func, sentinel) but uses an exception instead
- of a sentinel to end the loop.
-
- Priority queue iterator:
- iter_except(functools.partial(heappop, h), IndexError)
-
- Non-blocking dictionary iterator:
- iter_except(d.popitem, KeyError)
-
- Non-blocking deque iterator:
- iter_except(d.popleft, IndexError)
-
- Non-blocking iterator over a producer Queue:
- iter_except(q.get_nowait, Queue.Empty)
-
- Non-blocking set iterator:
- iter_except(s.pop, KeyError)
-
"""
+ # iter_except(d.popitem, KeyError) --> non-blocking dictionary iterator
try:
if first is not None:
- # For database APIs needing an initial call to db.first()
yield first()
while True:
yield func()
pass
-
The following recipes have a more mathematical flavor:
.. testcode::