Python里面有个特殊的模块叫做上下文模块,可以和with搭配来实现一些功能。


他的执行方式是用户需要一个定义一个生成器的函数;with后面跟这个函数,他会执行yield之前的代码;然后跳出来,执行with语句下面的代码,然后再切换回函数,执行finally后面的代码。


比如

import contextlib
@contextlib.contextmanager
def worker_state(state_list, worker_thread):
    state_list.append(worker_thread)
    try:
        yield
    finally:
        state_list.remove(worker_thread)
        print(state_list)
        
free_list = []
current_thread = "alex"

with worker_state(free_list, current_thread):
    print(123)
    print(456)
    print(free_list)
----------
123
456
['alex']
[]


例2 如果with后面跟个as,我们可以通过yield传递一个对象到as上面,比如下面我就把一个列表对象传给了tt

import contextlib
import socket

@contextlib.contextmanager
def test(num):
    a=[]
    a.append(num)
    try:
        yield a
    finally:
        num+=100
        print(num)


with test(20) as tt:
    print(tt)
 ------------
[20]
120