python 之 with-as

本文详细介绍了Python的with语句,它用于简化try-finally代码,提供优雅的异常处理方式。with语句适用于支持上下文管理协议的对象,如文件、锁等。通过举例说明了with语句在打开文件和自定义类中的使用,强调了__enter__和__exit__方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、用法

从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的博客-优快云博客

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值