上下文管理 with 语句
景书
2023-12-01
你有没有想过这样的情况:当我们需要使用一个文件时,只需要调用一个且调用一次某函数,就可以实现下面的功能:
该函数帮我们打开文件并返回一个文件描述符供我们操作,然后在我们操作完文件后该函数自动关闭文件。
(注意,上面的操作中从头到尾我们只调用了一次该函数。)
其实 Python 中就有这样的函数,它就是 with。
eg:
with open('/etc/passwd', 'r') as f:
# 下面为 with 的代码块
for eachLine in f:
....
在上面的例子中,with 自动帮我们打开文件,而执行完“ with 的代码块”后 with 自动帮我们将文件关闭。
不过你可能注意到了,这里 with 的“打开文件操作”还是调用了 open 函数,那么 with 的作用应该不仅仅是自动帮我们关闭文件那么简单吧。
的确如此,with 语句的作用在于从流程中把资源分配释放的相关代码统统去掉。
比如上面的代码,with 就帮我们在使用完文件之后关闭文件,不用我们在手动关闭了。
然后,with 还支持的协议对象有:
file (如上面的例子)
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore