老狗——Python中的With...as语句

一、语法

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、自定义的支持上下文的其它操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章