Вложение диспетчеров контекста Python

В этом вопросе я определил диспетчер контекста т шляпа содержит диспетчер контекста. Как проще всего осуществить это вложение? В итоге я вызвал self.porary_file .__ enter __ () в self .__ enter __ () . Однако в self .__ exit __ я почти уверен, что должен вызвать self.porary_file .__ exit __ (type_, value, traceback) в блоке finally в случае возникновения исключения. Следует ли мне устанавливать параметры type_, value и traceback, если что-то пойдет не так в self .__ exit __ ? Я проверил contextlib , но не нашел никаких утилит, которые помогли бы с этим.

Исходный код из вопроса:

import itertools as it
import tempfile

class WriteOnChangeFile:
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        self.temporary_file = tempfile.TemporaryFile('r+')
        self.f = self.temporary_file.__enter__()
        return self.f

    def __exit__(self, type_, value, traceback):
        try:
            try:
                with open(self.filename, 'r') as real_f:
                    self.f.seek(0)
                    overwrite = any(
                        l != real_l
                        for l, real_l in it.zip_longest(self.f, real_f))
            except IOError:
                overwrite = True
            if overwrite:
                with open(self.filename, 'w') as real_f:
                    self.f.seek(0)
                    for l in self.f:
                        real_f.write(l)
        finally:
            self.temporary_file.__exit__(type_, value, traceback)

7
задан Community 23 May 2017 в 12:32
поделиться