当前位置:   article > 正文

python 之 with-as_python with as用法

python with as用法

一、用法

python2.6开始,with就成为默认关键字了。With是一个控制流语句,跟if for while try之类的是一类,with可以用来简化try-finally代码,看起来比try finally更清晰,所以说with用很优雅的方式处理上下文环境产生的异常。with关键字的用法如下:

1

2

with expression as variable:

  with block

该代码块的执行过程是:

1.先执行expression,然后执行该表达式返回的对象实例的__enter__函数,然后将该函数的返回值赋给as后面的变量。(注意,是将__enter__函数的返回值赋给变量)

2.然后执行with block代码块,不论成功,错误,异常,在with block执行结束后,会执行第一步中的实例的__exit__函数。

with 语句仅能工作于支持上下文管理协议(context management protocol)的对象。也就是说只有内建了”上下文管理”的对象才能和 with 一起工作。如果对象没有__enter__、__exit__属性,使用with语句就会报错AttributeError: __enter__。Python内置了一些支持该协议的对象,如下所列是一个简短列表:

  • file

  • decimal.Context

  • thread.LockType

  • threading.Lock

  • threading.RLock

  • threading.Condition

  • threading.Semaphore

  • threading.BoundedSemaphore

  • with connect

二、例子

1.打开文件的例子

with-as语句最常见的一个用法是打开文件的操作,如下:

1

2

with open("decorator.py") as file:

  print file.readlines()

file对象支持支持上下文管理协议,并且可以推测出:__exit__属性中,一定回去执行file.close()

2.自定义

with语句后面的对象必须要有__enter__和__exit__方法,如下是一个自定义的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

class WithTest():

  def __init__(self,name):

    self.name = name

    pass

  def __enter__(self):

    print "This is enter function"

    return self

  def __exit__(self,e_t,e_v,t_b):

    print "Now, you are exit"

  def playNow(self):

    print "Now, I am playing"

print "**********"

with WithTest("coolboy") as test:

  print type(test)

  test.playNow()

  print test.name

print "**********"

上述代码运行的结果如下:

**********
This is enter function
<type 'instance'>
Now, I am playing
coolboy
Now, you are exit
**********

分析以上代码: 一二行,执行open函数,该函数返回一个文件对象的实例,然后执行了该实例的__enter__函数,该函数返回此实例本身,最后赋值给file变量。从456句可以印证。

参考文章(侵权删)

​​​​​​Python with语句常见错误AttributeError: __enter___coco_1998_2的博客-CSDN博客

https://www.jb51.net/article/135285.htm

Python 中with…as语句_吃兔子的白萝卜卜的博客-CSDN博客_python with语句

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/183193
推荐阅读
相关标签
  

闽ICP备14008679号