我有一对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关键字调用这些w / o会返回一个生成器。有没有办法通过plain-vanilla函数调用和巧克力上下文管理器来获得模式翻转行为?
答案 0 :(得分:5)
这样做:
class mod_user:
def __init__(self):
global MODE
self._old_mode = MODE
MODE = "user"
def __enter__(self):
pass
def __exit__(self, *args, **kws):
global MODE
MODE = self._old_mode
MODE = "sudo"
with mod_user():
print MODE # print : user.
print MODE # print: sudo.
mod_user()
print MODE # print: user.
答案 1 :(得分:2)
简单方法:
from contextlib import contextmanager
@contextmanager
def mode_user():
global MODE
old_mode = MODE
MODE = "user"
yield
MODE = old_mode
mode_sudo()
的同意。有关详细信息,请参阅the doc。它实际上是整个“定义实现__enter__
和__exit__
”的类的快捷方式。