У меня есть пара функций Python, которые в настоящее время переворачивают глобальную переменную между двумя значениями. Я хотел бы превратить их в контекстные менеджеры, чтобы я мог использовать их как блоки with
, устанавливая переменную внутри блока, но восстанавливая ее после. Вот желаемое поведение:
>>> MODE
'user'
>>> mode_sudo() # Sets MODE to 'sudo'...
>>> MODE
'sudo'
>>> mode_user() # Sets MODE to 'user'...
>>> MODE
'user'
>>> with mode_sudo():
... print MODE
'sudo'
>>> MODE
'user'
Возможна ли такая химера?
ОБНОВЛЕНИЕ: Просто для ясности вот реализация контекстного менеджера:
from contextlib import contextmanager
@contextmanager
def mode_sudo():
global MODE
old_mode = MODE
MODE = 'sudo'
yield
MODE = old_mode
@contextmanager
def mode_user():
global MODE
old_mode = MODE
MODE = 'user'
yield
MODE = old_mode
Вызов их без ключевого слова with возвращает генератор. Есть ли способ получить поведение переключения режимов как с вызовом простой ванильной функции, так и с менеджером контекста шоколада?
MODE
? - person Evpok   schedule 09.08.2011def set_mode(mode):
, а потомMODE = mode
? Таким образом, вам нужно получить код только один раз... - person glglgl   schedule 09.08.2011