程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

Python 高级编程和异步IO并发编程 --04_11 Python中的上下文管理器with语句

发布于2020-03-17 10:54     阅读(1674)     评论(0)     点赞(8)     收藏(2)


  1. # try_except_finally
  2. try:
  3. f_read = open("Tom.txt")
  4. print("code started")
  5. raise KeyError
  6. f_read.close()
  7. #raise IndexError # 此时就没有捕获到异常,代码出错
  8. f_read.close() # 打开正常时,才会执行该语句,如果有抛出异常,则不会执行该语句,
  9. # 此时应该在每次抛出error时,都执行f_read.close(),这样才可以释放该文件
  10. except KeyError as e:
  11. print("key error")
  12. f_read.close()
  13. else:
  14. print("other error") # 在没有抛异常时,捕捉其它异常。
  15. finally: # 无论前面的代码是否允许,都会执行finally后面的语句
  16. print("finally")
  17. f_read.close() # finally语句一般用于资源释放

  1. # try_except_finally
  2. def exe_try():
  3. try:
  4. print("code started")
  5. raise KeyError
  6. return 1 # 前一句,raise了一个KeyError,导致该语句没被执行
  7. except KeyError as e:
  8. print("key error")
  9. return 2 # 此时return 2,为什么执行结果会return 4?
  10. # 如果finally里面有return语句,就会return finally里面的return语句
  11. # 如果finally里面没有return语句,就会return调用之时的return语句 return 2
  12. # return 2时,将2压入堆栈里面,继续执行finally,在finally里面如果发现return语句,
  13. # 则将4压入栈顶。如果finally里面return语句,则返回之前压入的2
  14. else:
  15. print("other error") # 在没有抛异常时,捕捉其它异常。
  16. return 3
  17. finally: # 无论前面的代码是否允许,都会执行finally后面的语句
  18. print("finally")
  19. #return 4
  20. if __name__ == "__main__":
  21. result = exe_try()
  22. print(result)
  1. # 上下文管理器 with语句
  2. class Sample():
  3. def __enter__(self): # with 语句,默认会首先调用__enter__
  4. print("enter")
  5. # 获取资源
  6. return self
  7. def __exit__(selfs,exc_type,exc_val,exc_tb): # with 语句,来开时,会默认调用__exit__方法
  8. # 释放资源
  9. print("exit")
  10. def do_something(self):
  11. print("doing something")
  12. with Sample() as sample: # with语句可以实例化一个对象/类;嵌入with语句后,就会自动调用__exit__
  13. sample.do_something() # 我们并没有调用__enter__/__exit__这个魔法函数,但是系统还是自动的调用到__enter__/__exit__
  14. # 我们在定义类时,只需要在__enter__语句获取资源,__exit__语句释放资源,
  15. # 使用with语句,python解释器就可以对它们进行默认使用,此即上下文管理器协议
  1. C:\Users\Amber\PycharmProjects\test0\venv\Scripts\python.exe C:/Users/Amber/PycharmProjects/test0/Chapter03/with_test.py
  2. enter
  3. doing something
  4. exit

__enter__  + __exit__ 就构成了python上下文管理器协议,后续中应该常用这种架构

原文链接:https://blog.csdn.net/f2157120/article/details/104886358



所属网站分类: 技术文章 > 博客

作者:一切都会好起来over

链接:https://www.pythonheidong.com/blog/article/262597/e2e1180e32ec04cbed7a/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

8 0
收藏该文
已收藏

评论内容:(最多支持255个字符)