上下文管理器在Python中的妙用

4775f2b6d7e91b4dc3893cf1d38660f2.png

更多Python学习内容:ipengtao.com

Python上下文管理器是一个非常强大的工具,它能够帮助开发者在特定代码块前后自动执行特定的操作,常用于资源管理,如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用方法、实现自定义上下文管理器,以及实际应用场景和示例代码。

什么是上下文管理器

上下文管理器是一种协议(或者说是一组方法),它允许你在进入和退出一个代码块时自动运行一些代码。上下文管理器通常与 with 语句一起使用,以确保资源在使用后被正确释放。

基本语法

with expression as variable:# 在这里使用变量pass

在这个语法中,expression 是一个返回上下文管理器的对象,variable 是上下文管理器的返回值。with 语句确保在代码块结束后,适当的清理代码会自动执行。

示例:文件操作

一个典型的使用场景是文件操作。使用上下文管理器可以确保文件在使用后被正确关闭。

# 不使用上下文管理器
file = open('example.txt', 'r')
try:content = file.read()
finally:file.close()# 使用上下文管理器
with open('example.txt', 'r') as file:content = file.read()

在上面的示例中,with 语句确保文件在读取完毕后自动关闭,即使在读取过程中发生异常。

内置上下文管理器

Python内置了多个上下文管理器,常见的包括文件操作、线程锁和数据库连接等。

示例:使用锁

import threadinglock = threading.Lock()# 不使用上下文管理器
lock.acquire()
try:# 访问共享资源pass
finally:lock.release()# 使用上下文管理器
with lock:# 访问共享资源pass

在这个示例中,with 语句确保锁在访问共享资源后自动释放。

实现自定义上下文管理器

可以通过实现 __enter____exit__ 方法来自定义上下文管理器。这两个方法分别在进入和退出上下文时被调用。

示例:自定义上下文管理器

class MyContextManager:def __enter__(self):print("进入上下文")return selfdef __exit__(self, exc_type, exc_value, traceback):print("退出上下文")# 使用自定义上下文管理器
with MyContextManager() as manager:print("在上下文中")

在这个示例中,__enter__ 方法在进入上下文时打印消息,__exit__ 方法在退出上下文时打印消息。

使用 contextlib 模块

Python的 contextlib 模块提供了更方便的方式来创建上下文管理器,特别是对于简单的情况。

示例:使用 contextlib.contextmanager 装饰器

from contextlib import contextmanager@contextmanager
def my_context_manager():print("进入上下文")yieldprint("退出上下文")# 使用自定义上下文管理器
with my_context_manager():print("在上下文中")

在这个示例中,@contextmanager 装饰器将一个生成器函数转换为上下文管理器。yield 语句将控制权传递给 with 语句内部的代码块,代码块执行完毕后,执行 yield 之后的代码。

上下文管理器的实际应用

示例:计时器上下文管理器

一个常见的应用场景是创建一个计时器上下文管理器,用于测量代码块的执行时间。

import time
from contextlib import contextmanager@contextmanager
def timer():start_time = time.time()yieldend_time = time.time()print(f"执行时间: {end_time - start_time} 秒")# 使用计时器上下文管理器
with timer():# 模拟长时间运行的任务time.sleep(2)

在这个示例中,计时器上下文管理器测量代码块的执行时间,并在退出上下文时打印执行时间。

示例:数据库连接上下文管理器

另一个实际应用场景是管理数据库连接,确保在操作数据库后正确关闭连接。

import sqlite3
from contextlib import contextmanager@contextmanager
def db_connection(db_name):conn = sqlite3.connect(db_name)try:yield connfinally:conn.close()# 使用数据库连接上下文管理器
with db_connection('example.db') as conn:cursor = conn.cursor()cursor.execute('SELECT * FROM example_table')rows = cursor.fetchall()for row in rows:print(row)

在这个示例中,数据库连接上下文管理器确保在操作数据库后正确关闭连接。

处理异常

上下文管理器还可以用于处理异常,确保在发生异常时执行必要的清理操作。

示例:处理异常的上下文管理器

class ExceptionHandlingContextManager:def __enter__(self):print("进入上下文")return selfdef __exit__(self, exc_type, exc_value, traceback):if exc_type:print(f"异常类型: {exc_type}")print(f"异常值: {exc_value}")print("处理异常")return True  # 表示异常已经被处理print("退出上下文")return False  # 表示异常未被处理# 使用异常处理上下文管理器
with ExceptionHandlingContextManager() as manager:print("在上下文中")raise ValueError("这是一个示例异常")

在这个示例中,__exit__ 方法处理了在上下文中发生的异常,并返回 True 表示异常已经被处理。

总结

本文详细介绍了Python上下文管理器的概念、使用方法、自定义实现以及实际应用场景。通过内置和自定义上下文管理器,开发者可以在特定代码块前后自动执行特定操作,如资源管理和异常处理,确保代码更加优雅和高效。文中提供了丰富的示例代码,展示了文件操作、线程锁、计时器和数据库连接等常见应用。掌握上下文管理器的使用,可以显著提高代码的可读性和可维护性。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

3abaa3a5689ba55c974da37f38e132b1.gif

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

c750173fe3d99ded363bb8a02c3caa8c.jpeg

往期推荐

历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)

Python基础学习常见的100个问题.pdf(附答案)

学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)

Python办公自动化完全指南(免费PDF)

Python Web 开发常见的100个问题.PDF

肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】final关键字 | 避免派生、重写

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

AWS云计算平台:全方位服务与实践案例

摘要 在数字化浪潮的推动下&#xff0c;云计算已成为企业转型的强大引擎。AWS作为云计算的先锋&#xff0c;不仅提供了一系列强大的基础设施服务&#xff0c;更是在人工智能领域不断探索和创新。本文将带您领略AWS的全方位服务&#xff0c;并透过实际案例&#xff0c;感受其在…

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程 基本介绍&#xff1a; 1、后台增加自定义参数&#xff0c;对应会员升级页面&#xff0c;以及积分充值 2、视频&#xff0c;演员&#xff0c;专题&#xff0c;收藏&#xff0c;会员系统模块齐全&#xff0c;支持子分类…

发包真香之:scapy工具

scapy – python 可自由组包 参考学习&#xff1a;初识Scapy–Python的Scapy/Kamene模块学习之路 scapy 介绍 Scapy是基于Python语言的网络报文处理程序&#xff0c;它可以让用户发送、嗅探、解析、以及伪造网络报文&#xff0c;运用Scapy可以进行网路侦测、端口扫描、路由追…

已解决java.beans.IntrospectionException: 在Java Beans中内省过程失败的正确解决方法,亲测有效!!!

已解决java.beans.IntrospectionException: 在Java Beans中内省过程失败的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 检查命名规范 验证Getter/Setter匹配性 确认访问权限 审查类型一致性 简…

Android网络基础面试题之HTTPS的工作流程和原理

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 工作流程 HTTPS 默认工作在 TCP 协议443端口&#xff0c;它的工作流程一般如以下方式&#xff1a; 1、TCP 三次同步握手 2、客户端验证服务器…

SpringMVC 请求参数接收

目录 请求 传递单个参数 基本类型参数传递 未传递参数 传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时&#xff0c;主要分为…

字节豆包 MarsCode:AI 开发工具

MarsCode 是豆包旗下的智能编程助手&#xff0c;类似 GitHub Copilot 提供以智能代码补全为代表的核心能力&#xff0c;简单试用了下&#xff0c;免费&#xff0c;使用时需要手机号登录&#xff0c;代码补全还算 ok&#xff0c;聊天功能就有点差了。 还包括一个 AI 原生 IDE&am…

UNIAPP编译到微信小程序时,会多一层以组件命名的标签

UNIAPP编译到微信小程序时&#xff0c;会多一层以组件命名的标签 解决方案 可以配置virtualHost来配置 export default {options: {virtualHost: true} }

pygraphviz安装教程

踩了无数坑之后&#xff0c;终于把pygraphviz安装好了。 首先先说明我的配置情况&#xff0c;我是在pycharm里面使用anaconda的虚拟环境运行项目。要安装pygraphviz得先满足三个前置条件&#xff1a; &#xff08;1&#xff09;已安装python(version 3.10, 3.11, or 3.12) &…

DockerDesktop中mysql容器无法使用Exec窗口解决

解决前 需要登陆&#xff1a; 登陆后需要升级才能启动调试模式 需要订阅才能使用 解决后&#xff1a; 正常使用 解决方法&#xff1a; 不要在DockerDesktop中启动mysql容器&#xff0c;使用命令行启动 启动命令 docker run --name mysql_docker -e MYSQL_ROOT_PASSWORD12345…

怎么新建百度词条

新建百度词条是一个分步骤的过程&#xff0c;需要遵循一定的规则和流程。以下是百科参考网shaoshai整理详细的步骤&#xff1a; 点击输入图片描述&#xff08;最多30字&#xff09; 怎么新建百度词条 1. 注册百度账号 在创建百度词条之前&#xff0c;您需要先注册一个百度账号…

【LINUX】内核源码文件系统调用相关摸索

首先&#xff0c;先看看想测试那个系统调用&#xff0c;在应用层&#xff0c;如果使用C语言编程一般我们一来就是open函数&#xff0c;实际在测试的时候&#xff0c;直接用touch xxx.txt然后 echo "xxx" >> xxx.txt&#xff0c;这样就完成了文件创建和写文件的…

基于单片机光纤测距系统的设计与实现

摘要 &#xff1a; 光纤由于其频带宽 、 损耗低及抗干扰能力强等优点已被广泛地应用在通信 、 电子及电力方面 &#xff0c; 是我们生产生活中必不可少的媒介。 在实际的光纤实验 、 安装 、 运营和维护工作中 &#xff0c; 一种精准 、 轻便和易操作的光纤测距系统显得尤为重…

【系统架构设计师】七、信息安全技术基础知识(信息安全的概念|信息安全系统的组成框架|信息加解密技术)

目录 一、信息安全的概念 1.1 信息安全的基本要素和范围 1.2 信息存储安全 1.3 网络安全 二、信息安全系统的组成框架 2.1 技术体系 2.2 组织机构体系 2.3 管理体系 三、 信息加解密技术 3.1 数据加密 3.2 对称加密技术 3.3 非对称加密算法 3.4 数字信封 3.5 信…

springcloud-sentinel 限流组件中文文档

快速开始 欢迎来到 Sentinel 的世界&#xff01;这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以上的版本的运行时环境&#xff0c…

Windows 10,11 Server 2022 Install Docker-Desktop

docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 docker-compose Compose 是用于定义和运行…

centos 7.2 离线部署 mysql 5.7.37

1.安装依赖 清楚mysql从图的依赖 rpm -qa|grep mariadb 存在冲突依赖,进行卸载 rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64 确认gcc版本 ldd --version 安装mysql5.7所需要的依赖 mkdir -p /root/AllInstalls 只下载不安装,用于放到其他机器: yum inst…

Stateflow快速入门系列(-):构造并运行 Stateflow 图

Stateflow 提供了一种图形语言&#xff0c;包括状态转移图、流程图、状态转移表和真值表。您可以使用 Stateflow 来说明 MATLAB 算法和 Simulink 模型如何响应输入信号、事件和基于时间的条件。 Stateflow 使您能够设计和开发监控、任务调度、故障管理、通信协议、用户界面和混…

相亲交友微信小程序系统源码

开启浪漫邂逅新篇章 相亲交友——随着年龄的增长&#xff0c;越来越多的人开始关注自己的婚姻问题&#xff0c;为了提高相亲服务的质量&#xff0c;这款应用就可以拓宽在线社交网络范围。​ &#x1f491; 引言&#xff1a;邂逅爱情的新方式 在繁忙的都市生活中&#xff0c;寻…