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