Re: [python] Условный контекстный менеджер
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 21.06.24 11:21
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Задача: написать контекстный менеджер 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 не устроил?
Почему же, ё-моё, ты нигде не пишешь «ё»?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.