上下文(context)管理

讨论 eustance
Lv2 初级炼丹师
发布在 Python编程   1150   0
讨论 eustance   1150   0

    [toc]

    什么是上下文(context)管理

    任务(进程、线程)上下文是一个任务所必不可少的一组数据。任务在被中断之后,处理器保存上下文并提供中断处理(interrupt service routine),上下文的数据可能存放于处理器寄存器、任务所利用的内存、某些操作系统管理的任务所使用的控制寄存器,上下文越小,延迟越小。

    python上下文管理

    1. python一般使用with对上下文进行管理,可以对对象加入__enter__ 和__exit__方法定义上下文,enter 方法可以返回任意对象,它返回的任何对象都会被赋给 with 语句中的 as 所指向的变量,其中as result也可省略,exit() 无论如何都一定会被执行,即使抛出异常。
    with task as result:
        codes
    1. 也可以使用try:finally进行上下文管理,但是with更优雅。

    2. contextlib内置库,例如

    @contextlib.contextmanager
    def file_open(file_name, *args, **kwags):
        # 相当于__enter__
        file_handler = open(file_name, 'r')
        #
        yield file_handler
    
        # __exit__方法
        print('close file:', file_name, 'in __exit__')
        file_handler.close()
        return
    import contextlib
    
    # 自动调用
    def close(self, ):
        print('close str:', self.str)
    
    
    def __init__(self, strssssss):
        self.str = strssssss
        print('init str:', strssssss)
    
    
    def show(self):
        print(self.str)
    
    
    Stringggg = type('Stringggg', (object,), {'__init__': __init__, 'close': close, 'get_str': show})
    with contextlib.closing(Stringggg(strssssss='12')) as Z:
        pass
    # contextlib.closing的实现方式
    class closing(AbstractContextManager):
        def __init__(self, thing):
            self.thing = thing
        def __enter__(self):
            return self.thing
        def __exit__(self, *exc_info):
            self.thing.close()

    go上下文管理

    go使用context包进行上下文管理,

    js上下文管理

    js包括全局执行上下文、函数执行上下文、eval上下文

    全局执行上下文

    全局执行上下文只有一个,在客户端中一般由浏览器创建,也就是的window对象,可以通过this直接访问

    函数执行上下文

    每当一个函数被调用时都会创建一个函数上下文,每次调用,都会创建一个新的上下文,执行上下文栈是用来管理执行上下文的。在执行上下文创建好后,JavaScript引擎会将执行上下文压入到栈中,通常把这种用来管理执行上下文的栈称为执行上下文栈,又称调用栈。

    eval上下文

    与python类似

    exec() 函数的返回值只会是 None,与执行语句的结果无关,所执行的语句中,当然如果包含 return 或 yield ,它们产生的值无法在 exec 函数的外部起作用。

    eval() 函数的返回值是表达式的执行结果

    两者的 globals 和 locals 参数,起到的白名单的作用,限定命名空间的范围,可防止作用域内的数据被滥用。

    www.longtao.fun

    版权声明:作者保留权利,不代表意本站立场。如需转载请联系本站以及作者。

    参与讨论

    回复《 上下文(context)管理

    EditorJs 编辑器

    沙发,很寂寞~
    反馈
    to-top--btn