Почему 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). Но какой в этом смысл в случае перенаправления потоков чтения и записи? В какой ситуации это может понадобиться?


Ответы (0 шт):