我想要类似这样的东西:
from contextlib import contextmanager
@contextmanager
def loop(seq):
for i in seq:
try:
do_setup(i)
yield # with body executes here
do_cleanup(i)
except CustomError as e:
print(e)
with loop([1,2,3]):
do_something_else()
do_whatever()
但contextmanager无法正常工作,因为它期望生成器仅产生一次。
我想这么做的原因是因为我基本上想要创建自己的定制for循环。我有一个修改过的IPython用于控制测试设备。显然,它是一个完整的Python REPL,但是大多数时候用户只是调用预定义的函数(类似于Bash提示符),用户不需要是程序员或熟悉Python。需要一种方法对一些任意代码进行循环,并对每个迭代进行设置/清理和异常处理,且与以上with语句一样简单。
do_whatever()
)中的异常..这个解决方案没有。有什么想法吗?典型的场景可能是一些重试逻辑。 - ttyridalfor i in loop...
之外,它将无法被捕获,你需要在那里捕获它(也许使用contextmanager)。此外,contextlib.contextmanager创建了一个特殊的生成器,只能yield一次,而我需要一个可以为序列的每个元素yield的东西。你需要同时使用contextmanager和generator才能得到完整的解决方案(我将其发布为另一个答案)。 - jpkotta