【发布时间】:2011-10-22 17:52:47
【问题描述】:
我有一对 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
调用这些不带关键字返回一个生成器。有没有办法通过普通函数调用和巧克力上下文管理器来获得模式翻转行为?
【问题讨论】:
-
测试
MODE的值有什么意义? -
不多,我想。仔细检查时,边缘案例会蒸发。 :P
-
我已经删除了愚蠢的价值测试。
-
def set_mode(mode):和之后的MODE = mode怎么样?所以你只需要拥有一次代码...... -
在某些情况下这可能是一个更好的设计,但在这种情况下,我碰巧试图以向后兼容的方式将上下文管理器用于现有代码库。
标签: python state contextmanager stateful