Могу ли я использовать python with statement для условного выполнения?

Я пытаюсь написать код, поддерживающий следующую семантику:

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()

, но я не хочу навязывать слишком много внутренней структуры (т.е. того, как код делится на функции) на основе этих областей.
У кого-нибудь есть творческие идеи?

12
задан Oren S 30 November 2010 в 21:48
поделиться