Как мне написать трехблочный контекстный менеджер на Python?

У меня есть много функций, которые используют шаблон менеджера контекста:

@contextmanager
def f():
    # Do preliminary stuff.
    yield
    # Do final stuff.

Я использую ExitStack позвонить всем этим контекстным менеджерам.

Я рассматриваю шаблон:

@threeblock_contextmanager
def f():
    # Do preliminary stuff.
    yield
    # Do intermediary stuff.
    yield
    # Do final stuff.

Я искал источник и думал, что я каким-то образом его изменю. Есть ли хороший способ сделать это? Другой вариант - добавить метод к каждому классу, который возвращает менеджер контекста. Недостаток добавления метода заключается в том, что интуитивно понятное линейное представление кода теряется, потому что промежуточный материал будет в другом методе, а не помещен между предварительным и конечным компонентом, что я считаю более логичным.


По запросу, больше кода:

def fire(self, cluster_index, obs_count=1.0):
    with ExitStack() as stack:
        for link in self.terminal.out:
            stack.enter_context(
                link.source_firing(cluster_index, obs_count))
        for link in self.terminal.in_:
            stack.enter_context(
                link.target_firing(cluster_index, obs_count))

        # At this point all context managers have been run up until
        # their yield.   They saw a signal that was neither updated at
        # the source nor the target.

        # Update signals.

        # TODO: at this point, the context managers need to send any signals they
        # want to send and yield again.

    # At this point all context managers have been run entirely.
    # On closing, they saw a signal has been updated at both the source
    # and the receiver.

    self.ask_for_reschedule()

0 ответов

Другие вопросы по тегам