Python笔记(十一)——with...as关键字

我就是我 2022-01-25 15:08 228阅读 0赞

1.执行打开文件操作,是对try…except…finally 的优化,让代码更加美观

例如常用的开发文件的操作,用try except finally 实现:

  1. f=open('file_name','r')
  2. try:
  3. r=f.read()
  4. except:
  5. pass
  6. finally:
  7. f.close()

打开文件的时候,为了能正常释放文件的句柄,都要加个try,然后再finally里把f close掉,但是这样的代码不美观,finally就像个尾巴,一直托在后面,尤其是当try里面的语句时几十行

用with的实现:

  1. with open('file_name','r') as f:
  2. r=f.read()

这条语句就好简洁很多,当with里面的语句产生异常的话,也会正常关闭文件

2.上下文管理器的调用

with只适用于上下文管理器的调用,除了文件外,with还支持 threading、decimal等模块,当然我们也可以自己定义可以给with调用的上下文管理器

2.1使用类定义上下文管理器

  1. class A():
  2. def __enter__(self):
  3. self.a=1
  4. return self
  5. def f(self):
  6. print 'f'
  7. def __exit__(self,a,b,c):
  8. print 'exit'
  9. def func():
  10. return A()
  11. with A() as a:
  12. 1/0
  13. a.f()
  14. print a.a

使用类定义上下文管理器需要在类上定义__enter__和__exit__方法,执行with A() as a: 语句时会先执行__enter__方法,这个方法的返回值会赋值给后面的a变量,当with里面的语句产生异常或正常执行完时,都好调用类中的__exit__方法。

2.2使用生成器定义上下文管理器

  1. from contextlib import contextmanager
  2. @contextmanager
  3. def demo():
  4. print '这里的代码相当于__enter__里面的代码'
  5. yield 'i ma value'
  6. print '这里的代码相当于__exit__里面的代码'
  7. with demo() as value:
  8. print value

2.3 自定义支持 closing 的对象

  1. class closing(object):
  2. def __init__(self, thing):
  3. self.thing = thing
  4. def __enter__(self):
  5. return self.thing
  6. def __exit__(self, *exc_info):
  7. self.thing.close()
  8. class A():
  9. def __init__(self):
  10. self.thing=open('file_name','w')
  11. def f(self):
  12. print '运行函数'
  13. def close(self):
  14. self.thing.close()
  15. with closing(A()) as a:
  16. a.f()
  17. 在开发的过程中,会有很多对象在使用之后,是需要执行一条或多条语句来进行关闭,释放等操作的,例如上面说的的文件,还有数据库连接,锁的获取等,这些收尾的操作会让代码显得累赘,也会造成由于程序异常跳出后,没有执行到这些收尾操作,而导致一些系统的异常,还有就是很多程序员会忘记写上这些操作-\_-!-\_-!,为了避免这些错误的产生,with语句就被生产出来了。**with语句的作用就是让程序员不用写这些收尾的代码,并且即使程序异常也会执行到这些代码(finally的作用)**

转自:

https://www.cnblogs.com/Xjng/p/3927794.html

发表评论

表情:
评论列表 (有 0 条评论,228人围观)

还没有评论,来说两句吧...

相关阅读

    相关 阅读笔记

    近几年,微服务架构迅速在整个技术社区窜红,被认为是 IT 软件架构的未来方向。一线互联网公司由于具有大量的业务体量和业务场景,比如阿里、百度、网易,很早就开始入坑微服务架构。