如何用Python编写三块上下文管理器?

如何用Python编写三块上下文管理器?,python,contextmanager,Python,Contextmanager,我有许多利用上下文管理器模式的功能: @contextmanager def f(): # Do preliminary stuff. yield # Do final stuff. 我使用ExitStack调用所有这些上下文管理器 我正在考虑以下模式: @threeblock_contextmanager def f(): # Do preliminary stuff. yield # Do intermediary stuff. yi

我有许多利用上下文管理器模式的功能:

@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()

您是否真的将它们用作上下文管理器(使用“with”)?你能解释一下你期望一个由三部分组成的上下文管理器是如何工作的吗?@nneonno我想调用者必须将上下文管理器存储在一个列表中。使用openexitstack(或类似类)对它们中的每一个调用
enter_context
。在上下文管理器中的某个时刻,他可能会对每个上下文管理器调用一个方法,比如
middle
。最后,上下文管理器结束,ExitStack完成了它的常规操作。@nneonneo我本来打算发布一个答案,但我意识到我仍然完全不理解您将要完成的任务;如果你想问一个很好的方法来做X,那么就发布实际的代码,否则我们就有了答案。@AnttiHaapala:谢谢你考虑发布一个答案。代码很长。我有许多类彼此继承并公开了许多上下文管理器。这些方法通常使用带super()的
。方法(*args,**kwargs):
模式。所有这些方法都是由我在其他评论中详细描述的方法开始的。在这个过程中有什么不清楚的地方吗?