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