加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

是否有可能创建一个上下文敏感的python上下文管理器来保存,修改

发布时间:2020-12-20 11:19:56 所属栏目:Python 来源:网络整理
导读:我有一对 python函数,目前在两个值之间翻转一个全局变量.我想把它们变成上下文管理器,所以我可以像块一样使用它们,在块中设置变量,但之后恢复它.这是所需的行为: MODE'user' mode_sudo() # Sets MODE to 'sudo'... MODE'sudo' mode_user() # Sets MODE to '
我有一对 python函数,目前在两个值之间翻转一个全局变量.我想把它们变成上下文管理器,所以我可以像块一样使用它们,在块中设置变量,但之后恢复它.这是所需的行为:

>>> 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会返回一个生成器.有没有办法通过普通香草函数调用和巧克力上下文管理器获得模式翻转行为?

解决方法

像这样做:

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读