Почему contextlib._RedirectStream реализован как контекстный менеджер с возможностью повторного входа?
Читая код класса _RedirectStream библиотеки contextlib, я не могу понять, зачем атрибут _old_targets определен как список:
class _RedirectStream(AbstractContextManager):
_stream = None
def __init__(self, new_target):
self._new_target = new_target
# We use a list of old targets to make this CM re-entrant
self._old_targets = []
def __enter__(self):
self._old_targets.append(getattr(sys, self._stream))
setattr(sys, self._stream, self._new_target)
return self._new_target
def __exit__(self, exctype, excinst, exctb):
setattr(sys, self._stream, self._old_targets.pop())
Этот класс используется как основа для перенаправления стандартных потоков stdin, stdout и stderr, как, например, в contextlib.redirect_stdout. В комментарии указано, что список нужен для возможности повторного входа в тот же контекст (reentrant). Но какой в этом смысл в случае перенаправления потоков чтения и записи? В какой ситуации это может понадобиться?