次のセマンティクスをサポートするコードを作成しようとしています。
with scope('action_name') as s:
do_something()
...
do_some_other_stuff()
スコープ、とりわけ (セットアップ、クリーンアップ) は、このセクションを実行するかどうかを決定する必要があります。
たとえば、ユーザーが 'action_name' をバイパスするようにプログラムを構成した場合、Scope() が評価された後、最初に do_something() を呼び出さずに do_some_other_stuff() が実行されます。
私はこのコンテキストマネージャーを使用してそれをやろうとしました:
@contextmanager
def scope(action):
if action != 'bypass':
yield
しかし、RuntimeError: generator didn't yield
例外が発生しました(action
の場合'bypass'
)。
より冗長なオプションの実装に戻ることなく、これをサポートする方法を探しています。
with scope('action_name') as s:
if s.should_run():
do_something()
...
do_some_other_stuff()
どうすればこれを達成できるか知っている人はいますか?
ありがとう!
PS私はpython2.7を使用しています
編集:解決策は必ずしもステートメント
に依存する必要はありません。with
それなしでそれを表現する方法を正確に知りませんでした。本質的には、コンテキストの形式 (含まれるロジックとは関係なく、セットアップと自動クリーンアップをサポートする) が必要であり、setup メソッドに渡され、構成で選択されたパラメーターに基づいて条件付き実行を可能にします。
また、デコレータを使用して可能な解決策についても考えました。例:
@scope('action_name') # if 'action_name' in allowed actions, do:
# setup()
# do_action_name()
# cleanup()
# otherwise return
def do_action_name()
do_something()
しかし、これらのスコープに基づいて内部構造 (つまり、コードを関数に分割する方法) をあまり強制したくありません。
クリエイティブなアイデアを持っている人はいますか?