我正在尝试编写支持以下语义的代码:
with scope('action_name') as s:
do_something()
...
do_some_other_stuff()
除其他事项(设置、清理)外,范围应决定此部分是否应运行。
例如,如果用户将程序配置为绕过“action_name”,那么在评估 Scope() 之后,do_some_other_stuff() 将在不先调用 do_something() 的情况下执行。
我尝试使用这个上下文管理器来做到这一点:
@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
语句。没有它,我只是不知道如何表达它。本质上,我想要上下文形式的东西(支持设置和自动清理,与包含的逻辑无关)并允许基于传递给设置方法并在配置中选择的参数进行条件执行。
我还考虑了使用装饰器的可能解决方案。例子:
@scope('action_name') # if 'action_name' in allowed actions, do:
# setup()
# do_action_name()
# cleanup()
# otherwise return
def do_action_name()
do_something()
但我不想基于这些范围强制执行过多的内部结构(即代码如何划分为函数)。
有没有人有一些创造性的想法?