Я хочу что-то вроде этого:
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.