首页 > 编程语言 >Python 中 with 语句的详解

Python 中 with 语句的详解

时间:2023-03-15 23:47:51浏览次数:71  
标签:语句 __ exc ... Python 详解 exit print

1. 概述

在 Python 中,只要一个对象实现了 __enter____exit__ 方法,那么就能使用 with 语句,该对象也可以称之为上下文管理器。

官方文档的相关说明:
image

上下文管理器的语法:

with ...:
    代码处理块

# ======================

with ... as ...:
    代码处理块

2. 代码示例

"""
数据库操作:
    连接数据库
    执行sql语句
    释放资源
"""

class MyResource(object):
    def __enter__(self):
        print("连接数据库")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        """
            功能:处理异常 + 回收资源
        """
        print("exc_type = {}, exc_value = {}, traceback = {}".format(exc_type, exc_value, traceback))
        if traceback:
            print("process exception")
        else:
            print("no exception")

        print("关闭数据库的连接")

        # return False    如果有异常,返回 False 的话,将会在 with 外部抛出异常
        # return True     如果有异常,返回 True 的话,表示在函数内部已经处理了异常,这时,在 with 外部就不用再抛出异常
        # 如果什么都不返回,那么就相当于返回 None,返回 None 就相当于返回了 False
        return True

    def query(self):
        print("执行数据库的相关操作")


with MyResource() as resource:
    resource.query()
    # 1 / 0

代码说明:

  1. 使用 with ... as ... 操作一个上下文管理器时,进入该对象的运行上下文,将会自动调用 __enter__ 方法
  2. as 后面跟着的变量 resource 的值,是 __enter__ 函数的返回值,所以 __enter__ 函数内一般用 return self 返回实例对象
  3. with 语句块用来执行中间步骤的相关操作
  4. 操作结束后,退出该对象的上下文,将会自动调用 __exit__ 方法
  5. __exit__ 具有【异常处理】和【资源回收】的功能
  6. __exit__ 接收 4 个参数,各个参数描述了导致上下文退出的异常情况
  7. __exit__ 的返回值为布尔值(有异常的情况下,【返回False】或【什么都不返回】内部的错误将会向外抛出;如果【返回True】,外部将不会接收到异常情况)

看下最常用的 open 操作

"""
文件读写:
    打开文件
    读取文件或写入文件
    关闭文件
"""

with open(path, 'w+', encoding='utf-8') as f:
    f.write(s)


with open(path, 'r', encoding='utf-8') as f:
    s = f.read()

内置函数 open 中已经实现了 __enter____exit___,不需要我们自己去实现

3. 额外说明

对于 with ... as ... 语句,我们也可以使用 try ... except ... finally 或者 if ... else ... 等相关语法来代替,但是使用 with 语句可以简化代码,可以更好的组织代码,因此,为了更优雅的编写代码,推荐使用 with 语句。

标签:语句,__,exc,...,Python,详解,exit,print
From: https://www.cnblogs.com/wanghuizhao/p/17220686.html

相关文章

  • python发邮件
    importsmtplibfromemail.mime.textimportMIMEText#邮件正文fromemail.headerimportHeader#邮件头#登录邮件服务器smtp_obj=smtplib.SMTP_SSL("s......
  • python配置和多版本
    python安装镜像安装包:https://registry.npmmirror.com/binary.html?path=python/选择python-3.*-amd64.exe即可pip下载包使用国内镜像的配置在C:\Users\username\p......
  • Python 异步: 异步推导式(18)
    动动发财的小手,点个赞吧!当我们想到“pythonic”时,理解,如列表和字典理解是Python的一个特性。这是我们执行循环的一种方式,与许多其他语言不同。Asyncio允许我们使用异......
  • Python Flask JinJa2 语法介绍与示例讲解
    目录一、概述二、JinJa2语法介绍与示例讲解1)变量2)控制结构3)循环结构4)宏5)过滤器6)继承7)包含一、概述Flask是一个轻量级的PythonWeb框架,支持Jinja2模板引擎。Jinja2是一个......
  • 站不住就准备加仓,这个pandas语句该咋写?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【还有多远】问了一个Pandas处理的问题,这里拿出来给大家分享下。看上去不太好理解,这里继续给个样式。只有一个条......
  • Maven POM.xml 标签详解
    pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其......
  • Java虚拟机详解——JVM常见问题总结
    面试必问关键词:JVM垃圾回收、类加载机制。 先把本文的目录画一个思维导图:一、Java引用的四种状态:强引用:用的最广。我们平时写代码时,new一个Object存放在堆内存......
  • 基于python实现的抓取腾讯视频所有电影的爬虫
    我搜集了国内10几个电影网站的数据,里面近几十W条记录,用文本没法存,mongodb学习成本非常低,安装、下载、运行起来不会花你5分钟时间。#-*-coding:utf-8-*-importreimport......
  • python应用题 字符填充
    提示代码#请在_______完善代码s=input()print("{_______(1)_________}".format(_______(2)_________))......
  • python爬虫案列08:梨视频爬取一个短视频
    importrequestsfromlxmlimportetreeimportos#拿到视频地址urlurl='https://www.pearvideo.com/video_1160135'#提取url中的cont_id,后面用cont_id=url.sp......