【发布时间】:2010-11-30 13:37:53
【问题描述】:
我正在尝试编写支持以下语义的代码:
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()
有谁知道我如何做到这一点?
谢谢!
附:我正在使用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()
但我不想基于这些范围强制执行过多的内部结构(即代码如何划分为函数)。
有人有什么创意吗?
【问题讨论】:
-
withis notif...你可以写s.do_something()并让上下文管理器返回一个什么都不做的对象。 -
也想过,但还是希望能找到优雅的解决方案……
-
另外,我对这个范围内的代码(例如,do_something())一无所知。
标签: python with-statement