Python的with关键字

本文最后更新于:2024年8月11日 晚上

参考文档 | 参考文档2

经过一些学习,对于

1
2
with open('file_path.txt',encoding='utf-8') as f:
var = f.read()

早已见怪不怪,但是在异步的进一步学习中又遇到了类似于with async ... 的方法,因此with并不是专门为读取文本设计的。

他还有一些有趣的地方

with是py实现上下文管理的一种方式,它在一定程度上是try -- finally的缩写版本,出现异常时能够正确退出,但是本身不具备异常捕获功能。同时他会把后面函数(如open())的返回值赋值给as *

我们可以自己定义一个支持with方法的类,只要这个类实现了__enter()____exit()__方法即可,正常实行时会先执行__enter()__进行初始化,内部支持若干其他方法,发生异常时则会调用__exit()__方法来安全退出。

1
2
3
4
5
6
7
8
9
10
11
12
13
class with_support():
def __init__(self):
self.file = None
def __enter__(self,file_path,encoding):
self.file = open(file_path,encoding)
return self
def __exit__(self):
self.file.close()
def read(page):
return self.file.read(page)
if __name__ == '__main__':
with with_support('test.txt') as ws:
print(ws.read())

上面是构造出的一个粗糙的示例,在__enter__()中将返回selfws,而后ws即可调用类中的其他方法。

当然,如果你有一个实现了异步读取文件的类,可以这么写:

1
2
async with aysnc_open('test.txt') as f:
cotent = await f.read()

这反应了异步跟with的一些关系


Python的with关键字
https://qlozin.top/2023/01/10/关于with/
作者
QLozan
发布于
2023年1月11日
更新于
2024年8月11日
许可协议