在 Python 中使用上下文管理器的 5 个层次(5 Levels of Using Context Managers in Python)
文章目录
不仅是关于 "with "的说法
与上下文管理器context managers相对的 "with "语句是初学者最容易混淆的 Python 特性之一。因为并不是每种编程语言都有这种语法。
因此,不幸的是,Python 开发人员的许多面试问题都围绕着这个主题。仅列举几个:
- Python 中的 "with "语句有什么作用?
- 你能把上下文管理器context manager写成一个 Python 类吗?
- 您能将上下文管理器context manager写成一个 Python 函数吗?
- 如何在 Python 中异步处理上下文管理器?
似乎很吓人?
完全不用担心。本文将使用适合初学者的示例,逐步揭开这一主题的神秘面纱。
1. 什么是上下文管理器?
由于每台机器的计算资源都是有限的,因此每个程序都需要考虑资源管理。比如文件处理,最好在使用完文件后将其关闭。
例如,如果我们在一个循环中打开超过 1000000 个文件,并且像下面的程序一样从不关闭任何文件:
files = []
for x in range(1000000):
files.append(open('test.txt', 'w'))
将出现错误:
OSError: [Errno 24] Too many open files: 'test.txt'
因此,只要不再需要,就应关闭每个已打开的文件。
Python 有相对的内置函数built-in functions,因此我们可以方便地打开和关闭文件。
f = open("test.txt", 'w')
f.write("Hi,Yang!")
f.close()
上述程序是可行的。但是,如果 open()
和 close()
之间的处理过程变得更加复杂,并且出现错误,那么没有人能够保证文件最终会被关闭。
更不用说,如果我们总是需要手动关闭打开的文件,那么当程序变得越来越复杂时,我们很可能会忘记关闭其中的一些文件,而如果 Python 不能自动为我们关闭这些文件,那就真的不够优雅了。
这里介绍了Python中的上下文管理器context managers和 “with” 语句。简单地说,它们是Python中简化资源管理的特性。
在深入研究 “with” 语句之前,让我们先来看看一种经典的方法。
2. 使用 “try…except…finally” 结构
显然,我们需要确保无论在文件处理过程中发生了什么,文件最终都会被关闭。与其他编程语言一样,我们可以编写 "try…except…finally "结构来实现这一点。
例如,下面的程序会打开一个文件,无论 “writing” 操作成功与否,它都会关闭该文件:
f = open("test.txt",'w')
try:
f.write