一、语法
with context as var:
with_suite
with语句
:可以代替try…except…finally语句,使代码更加简洁;
context
:通常是表达式,返回一个对象;
var变量
:用来保存context返回的对象,可以是单个值或元组;
with_suite
:使用变量var对context返回对象进行各种操作的代码段
二、示例
查看文件内容
XZ:learn xz$ cat with.txt
with...as...
12345
abcde
In [2]: with open('with.txt','r+') as f:
...: for line in f.readlines():
...: print(line)
...: print('with is closed : ', f.closed)
...:
...:
with...as...
12345
abcde
with is closed : True
打开文本with.txt,f变量接收文件对象返回的对象;
读取文本中的内容,逐行打印;
with中的代码执行完成后,会自动关闭文件;
如果with语句中没有做try…except异常处理,出现错误时会直接将异常交给Python解释器抛出,不会自动关闭文件,如果做了try…except异常处理,出现异常时,会自动关闭文件,再抛出异常。
三、原理
1、with语句实质上是上下文管理
- 上下文管理协议:包含2个方法:enter__和__exit;
- 支持该协议的对象,要实现这2个方法,才能被with语句进行操作。
2、上下文管理器
- 定义执行with语句时建立的运行时上下文,负责执行with语句上下文的进入和退出操作;
- 进入上下文管理器:调用管理器__enter__方法,如果设置了as var语句,变量var接受__enter__方法的返回值;
- 退出上下文管理器:调用管理器的__exit__方法。
四、应用场景
1、文件操作
2、进程线程之间互斥对象,如互斥锁
3、自定义的支持上下文的其它操作