コンテキスト マネージャー パターンを利用する多くの関数があります。
@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.
ソースを見て、何らかの方法で変更したいと考えていました。これを達成する良い方法はありますか?もう 1 つのオプションは、コンテキスト マネージャーを返すメソッドを各クラスに追加することです。メソッドを追加することの欠点は、コードの直感的な線形ビューが失われることです。中間のものは、予備のものと最終のものの間に配置されるのではなく、別の方法になるためです。これは、より論理的だと思います。
要求に応じて、追加のコード:
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()