Source code for ewoksdata.data.contextiterator

import functools
from typing import Iterator
from collections.abc import Generator


[docs] class ContextIterator(Generator): """Can wrap an iterator or generator to ensure cleanup when used as a context manager.""" def __init__(self, it: Iterator): self._it = it def __iter__(self): return self def __next__(self): return next(self._it) def __enter__(self): return self def __exit__(self, *_): if hasattr(self._it, "close"): return self._it.close()
[docs] def send(self, value): if hasattr(self._it, "send"): return self._it.send(value)
[docs] def throw(self, *args): if hasattr(self._it, "throw"): return self._it.throw(*args)
[docs] def contextiterator(iterator): """Decorator that allows to use an iterator or generator as a context manager. This ensures that the iterator is closed when exiting the context manager. """ @functools.wraps(iterator) def wrapper(*args, **kw): return ContextIterator(iterator(*args, **kw)) return wrapper