我正在尝试编写支持以下语义的代码:
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
但是在action
为'bypass'
时,出现了RuntimeError: generator didn't yield
异常。我正在寻找一种支持此功能的方法,而不必回到更冗长的可选实现:
with scope('action_name') as s:
if s.should_run():
do_something()
...
do_some_other_stuff()
有谁知道我如何实现这个目标吗?
谢谢!
P.S. 我正在使用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()
但我不想根据这些作用域太过强制内部结构(即代码如何分割成函数)。
有没有一些创意的想法?
s.do_something()
,并使上下文管理器返回一个什么都不做的对象。 - Jochen Ritzel