Здравствуйте, Буравчик, Вы писали:
Б>Задача: написать контекстный менеджер need_run, который мог бы выполнять или не выполнять код в зависимости от заданного условия.
Б>Возможно ли в принципе? Возможно ли решение без привязки к конкретной реализации?
Если и возможно, то как-то очень хитро. Доки говорят, что код
with EXPRESSION as TARGET:
SUITE
эквивалентен следующему:
manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False
try:
TARGET = value
SUITE
except:
hit_except = True
if not exit(manager, *sys.exc_info()):
raise
finally:
if not hit_except:
exit(manager, None, None, None)
То есть никаких зацепок для предотвращения запуска полезной нагрузки просто не предусмотрено. Можно швырнуть исключение в __enter__(), но тогда весь with упадёт.
Не исключаю, что существуют какие-то трюки с залезанием во всякие дебри, но тут у меня недостаточно знаний.
А из интереса, почему именно with? Чем if не устроил?