随笔 - 136  文章 - 0  评论 - 0  阅读 - 43004

python with语句

python with语句

  • with语句的作用

    with语句是python引入的一种与异常处理相关的功能,可以看作是try...finally语句的简化.
    with语句常用于对资源进行访问的场景,可以确保在对资源操作过程中不管是否发生异常,都能自动地正常释放资源.
  • with语句的基本语法

    with expression [as variable]:
       with-block

    """
    expression:返回一个支持上下文管理协议的对象,返回的对象可以在with-block开始前执行初始化程序,在with-block完成后执行终止化程序代码,不论with-block中是否发生异常

    variable:variable一般来说被赋值的是expression返回的对象
    """
  • 上下文管理器

    """
    理解with语句,先理解python的上下文管理器.
    作为上下文管理器,必须实现两个方法:

    __enter__():上文方法,负责进入运行时上下文的准备操作,返回的值可以是上下文管理器对象,也可以是与运行时上下文相关的其他对象,如果with语句有as,会把其返回的值赋值给as后的变量上.

    __exit__():下文方法,负责退出运行时上下文的清理操作,返回一个布尔值,这个布尔值标明如果with-block的退出是由异常引发的,该异常是否需要被忽略(返回值为False:这个异常将被重新引发一次;返回值为True:这个异常就会被忽略,继续执行后面的代码)

    这两个方法就是上下文管理器协议,实现了这两个方法的对象就是上下文管理器.
    """
  • 自定义上下文管理器

    # python的一些内置工具实现了上下文管理协议,如open(file),threading.Lock,threading.RLock等.

    # 还可以自定义上下文管理器
    # 自定义上下文管理器类
    class File(object):
       # 初始化方法
       def __init__(self, file_name, file_mode):
           # 定义变量保存文件名称和文件的打开模式
           self.file_name = file_name
           self.file_mode = file_mode

       # 上文方法:负责进入语句块的准备操作,返回操作对象资源(如文件对象,数据库连接对象),也可以是其他相关对象
       def __enter__(self):
           # 返回文件资源
           self.file = open(self.file_name, self.file_mode)
           return self.file


       """
      下文方法:负责离开语句块的清理操作,释放资源,如关闭文件,关闭数据库连接对象
      exc_type:异常类型,如果执行无异常,值为None
      exc_val:异常值,如果执行无异常,值为None
      exc_tb:traecback信息,如果执行无异常,值为None
      """
       def __exit__(self, exc_type, exc_val, exc_tb):
           print("退出")
           # 释放资源
           self.file.close()


    """
    with语句结合上下文管理器使用
    with语句执行流程:
      1. 执行File("text1.txt", "r")语句,获取上下文管理器
      2. 加载上下文管理器的__exit__()方法等后续调用
      3. 调用上下文管理器的__enter__()方法
      4. 如果有as关键字,就将__enter__()方法的返回值赋值给as后边的变量
      5. 执行子代码块with-block
      6. 不管执行子代码块with-block时是否发生异常,都自动执行上下文管理器的__exit__()方法,执行清理操作
          6.1 如果执行过程中没有发生异常,则以None为参数调用__exit__(None, None, None)
          6.2 如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback)
      7. 出现异常时:
          7.1 如果__exit__(type, value, traceback) == False:重新抛出异常,让with之外的语句来处理异常
          7.2 如果__exit__(type, value, traceback) == True:忽略异常,不再对异常进行处理
    """
    with File("text1.txt", "r") as f:
       # file_content = f.read()
       # print(file_content)
       # 因为文件打开方式是只读,写入肯定会发生异常
       f.write("aaa")
posted on   CJTARRR  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示