Я пытаюсь написать код, поддерживающий следующую семантику:
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: генератор не выдал исключение
(когда действие
равно 'bypass'
).
Я ищу способ поддержать это, не возвращаясь к более подробной дополнительной реализации:
with scope('action_name') as s:
if s.should_run():
do_something()
...
do_some_other_stuff()
Кто-нибудь знает, как я могу этого добиться?
Спасибо!
PS Я использую python2.7
РЕДАКТИРОВАТЬ:
Решение не обязательно должно полагаться на с
операторами. Я просто не знала, как это выразить без этого. По сути, мне нужно что-то в форме контекста (поддерживающее настройку и автоматическую очистку, не связанное с содержащейся логикой) и позволяющее условное выполнение на основе параметров, переданных в метод настройки и выбранных в конфигурации.
Еще подумал о возможном решении с помощью декораторов. Пример:
@scope('action_name') # if 'action_name' in allowed actions, do:
# setup()
# do_action_name()
# cleanup()
# otherwise return
def do_action_name()
do_something()
, но я не хочу навязывать слишком много внутренней структуры (т.е. того, как код делится на функции) на основе этих областей.
У кого-нибудь есть творческие идеи?