19_Python中的上下文管理器

news2024/12/27 1:32:27

在这里插入图片描述

Python中的上下文管理器

在Python中,上下文管理器(Context Manager)是一种用于资源管理的技术,它可以确保资源在使用后被正确释放,例如文件、网络连接或锁。

  • 上下文管理器(Context Manager)是指那些实现了__enter__和__exit__魔术方法的对象。这些方法允许Python在代码块执行前后自动执行特定的操作,如打开文件、创建数据库连接、获取锁等。
  • 使用with语句是管理上下文的一种方式,它可以自动处理资源的打开和关闭。

上下文管理器的作用

  • 资源管理:上下文管理器的主要作用是确保资源在使用后被正确地释放。资源可以是文件、网络连接、数据库连接、锁等。使用上下文管理器可以减少资源泄漏的风险,并简化资源管理的代码。
  • 简化代码:通过使用with语句,上下文管理器可以自动处理资源的设置和清理工作,而不需要开发者手动编写这些逻辑。这使得代码更加简洁、易读。
  • 异常处理:上下文管理器可以在资源使用过程中处理异常。如果在使用资源时发生异常,上下文管理器的__exit__方法可以捕获这些异常,并进行适当的清理工作,如关闭文件或释放锁,即使在发生错误的情况下也能保证资源被正确释放。
  • 维护上下文状态:上下文管理器可以用来设置和恢复某些上下文相关的状态,例如,更改和恢复全局变量的值,或者设置和取消线程局部存储。

上下文管理器的一些具体应用场景

  • 文件操作:使用open函数打开文件时,它会自动处理文件的打开和关闭,即使在文件操作中出现异常也能确保文件被关闭。
  • 数据库连接:使用数据库API时,上下文管理器可以确保数据库连接在操作完成后被关闭。
  • 线程同步:在多线程编程中,使用锁(Locks)或其他同步原语时,上下文管理器可以确保锁在临界区代码执行后被释放,即使发生异常也是如此。
  • 网络连接:管理网络连接时,上下文管理器可以确保连接在完成请求后被关闭。
# 导入os模块以使用os.path.exists函数
import os

# 定义文件路径
file_path = 'example.txt'

# 检查文件是否存在,如果不存在则创建并写入内容
if not os.path.exists(file_path):
    # 使用with语句和open函数以写入模式打开文件
    # with语句确保文件在操作完成后会被正确关闭
    with open(file_path, 'w') as file:
        # 写入一行文本到文件
        file.write('Hello, World!\n')
        # 在这里不需要手动关闭文件,因为with语句会自动处理

# 如果文件已存在,则追加内容
else:
    # 使用with语句和open函数以追加模式打开文件
    with open(file_path, 'a') as file:
        # 追加一行文本到文件
        file.write('This is an appended line.\n')
        # 文件会在with语句块结束时自动关闭

在这个例子中,with语句被用来管理文件的打开和关闭。当with块结束时,文件会自动关闭,即使在写入过程中发生异常也是如此。这是上下文管理器的一个关键特性,它使得资源管理更加安全和简洁。

open() 函数中实现上下文管理器

用于文件操作。

# 打开文件并写入内容
with open('example.txt', 'w') as file:
    file.write('Hello, World!')

# 打开文件并读取内容
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

sqlite3.connect() 函数中实现上下文管理器

它可以自动创建和关闭数据库连接。

import sqlite3

# 连接到SQLite数据库
with sqlite3.connect('example.db') as connection:
    cursor = connection.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)')

threading.Lock() 函数中实现上下文管理器

它可以自动获取和释放锁。

import threading

# 创建一个锁对象
lock = threading.Lock()

# 使用锁确保线程安全
with lock:
    # 执行线程安全的操作
    print('Critical section')

自定义上下文管理器类

time.sleep() 函数不是一个上下文管理器,但它可以与with语句一起使用,以确保在等待时间后自动执行后续代码。

在这个例子中,sleep_context 类实现了上下文管理器协议,允许你使用 with 语句来等待指定的时间。当 with 代码块结束时,exit 方法会被调用,执行 time.sleep(self.seconds)。

import time

class sleep_context:
    def __init__(self, seconds):
        self.seconds = seconds
    
    def __enter__(self):
        # 在这里不需要做任何事情,因为我们将等待放在 __exit__ 方法中
        pass
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        # 等待指定的时间
        time.sleep(self.seconds)
        # 返回 False 来确保任何在代码块中引发的异常都会被正常处理
        return False

# 使用自定义的上下文管理器来等待3秒
with sleep_context(3):
    # 等待后继续执行
    print('Sleep is over')

附件

本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89788897

如有问题请留言。

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

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

相关文章

每日一练:二叉树的直径

543. 二叉树的直径 - 力扣(LeetCode) 一、题目要求 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之…

SpringBoot实现OAuth客户端

背景 5 月份的时候,我实践并整理了一篇博客:SpringBoot搭建OAuth2,该博客完成之后,本以为能对OAuth2的认证机制更加清晰,但我却觉得自己更“迷惘”了。 抛开我在项目中积累的浅薄经验不谈,单从在网…

9月16日笔记

访问控制列表 访问控制列表(ACL)是访问控制项(Access Control Entry , ACE)的列表。安全对象的安全描述可以通过两种访问控制列表DACL和SACL进行。 DACL DACL 是由一条条的访问控制项(ACE)条目构成的,每条ACE定义了哪些用户或组对该对象拥有怎样的访问权限。DACL…

进阶SpringBoot之集合 Redis

&#xff08;在跑 Redis 测试之前&#xff0c;需要先安装 Redis&#xff0c;并开启 Redis 服务&#xff09; Spring Boot 项目添加依赖 NoSQL -> Spring Data Redis pom.xml 文件如下 <dependencies><dependency><groupId>org.springframework.boot<…

实时数据的处理一致性

实时数据一致性的定义以及面临的挑战‍‍‍‍‍ 数据一致性通常指的是数据在整个系统或多个系统中保持准确、可靠和同步的状态。在实时数据处理中&#xff0c;一致性包括但不限于数据的准确性、完整性、时效性和顺序性。 下图是典型的实时/流式数据处理的流程&#xff1a; 1、…

佰朔资本:沪港通,深港通,港股通的区别与联系?

沪港通&#xff0c;深港通&#xff0c;港股通的差异与联系&#xff1a; 1、沪港通是“沪港股票市场生意互联互通机制”的简称&#xff0c;包含“沪股通”和“沪港通下的港股通”。 &#xff08;1&#xff09;“沪股通”是指投资者托付香港经纪商&#xff0c;经由联交地址上海…

kettle从入门到精通 第八十六课 ETL之kettle kettle调用https接口忽略SSL校验

1、在使用kettle调用接口的时候不可避免要调用http或者https接口&#xff0c;调用http接口kettle可以正常工作&#xff0c;但是遇到https接口的时候kettle就会提示证书有误&#xff0c;无法正常调用接口&#xff0c;今天咱们一起通过自研插件的方式来解决这个问题。自研插件需要…

启明云端WT32C3-S2模组,乐鑫ESP32-C3芯片开发应用,设备联网通信方案

随着科技的飞速发展&#xff0c;我们正步入一个全新的时代——物联网时代。在这个时代&#xff0c;每一个设备都不再是孤立的个体&#xff0c;而是通过无线网络相互连接、相互沟通的智能节点。 想象一下&#xff0c;当你走进家门&#xff0c;灯光自动亮起&#xff0c;空调调整…

认识NDK

什么是NDK&#xff08;Native Development Kit&#xff09; The Android NDK is a toolset that lets you implement parts of your app in native code, using languages such as C and C. &emdp; Android NDK 是一个工具集&#xff0c;可让您使用 C 和 C 等语言以原生代…

CANdela/Diva系列8--如何生成0x27服务解锁的DLL

本系列的上一篇文章中&#xff0c;我们介绍了如何在CDD文件中去根据客户需求来配置诊断服务&#xff0c;其实每个诊断服务的配置方式都是大同小异&#xff0c;但是0x27服务略有不同&#xff0c;为了能够让CDD文件根据ECU返回的种子去自动计算出密钥&#xff0c;需要添加一个解锁…

流域碳中和技术

随着全球气候变化的加剧&#xff0c;碳中和已成为实现可持续发展的重要目标之一。碳中和不仅仅是能源和工业领域的调整&#xff0c;它涉及整个生态系统的转型与再生。在这一过程中&#xff0c;流域的生态系统作为水、土、生物多样性等自然资源的集成体&#xff0c;扮演着至关重…

解密.baxia勒索病毒:.baxia勒索病毒的攻击手法及防护建议

导言 在当前网络安全形势日益严峻的背景下&#xff0c;勒索软件的威胁正不断升级&#xff0c;其中.baxia勒索病毒尤为突出。作为一种新型恶意软件&#xff0c;.baxia病毒通过加密用户的文件并要求支付赎金来获取解密密钥&#xff0c;对个人和企业的安全构成了严重威胁。随着其…

【LLM多模态】视频理解模型Cogvlm-video和MVBench评测基准

note Cogvlm-video模型通过视频抽帧&#xff08;24帧&#xff0c;每帧大小为224 x 224&#xff09;后经过ViT进行图像编码&#xff08;ViT中添加了2x2的卷积核更好的压缩视觉信息&#xff09;&#xff0c;使用adapter模块更好的将视觉特征和文本特征对齐&#xff0c;得到的图像…

基于WebServer的工业数据采集系统

一、项目框架及流程 二、http简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&#xff0c;是用于Web Browser&#xff08;浏览器&#xff09;到Web Server&#xff08;服务器&#xff09;进行数据交互的传输协议。 HTTP是应用层协…

poi生成的ppt,powerPoint打开提示内容错误解决方案

poi生成的ppt&#xff0c;powerPoint打开提示内容错误解决方案 最近做了ppt的生成&#xff0c;使用poi制作ppt&#xff0c;出现一个问题。微软的powerPoint打不开&#xff0c;提示错误信息 通过xml对比工具发现只需要删除幻灯片的某些标签即可解决。 用的是XML Notepand 分…

ai写论文哪个平台好?7款AI写论文软件帮你撰写论文

在当今学术研究和写作领域&#xff0c;AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是七款推荐的AI写论文软件&#xff0c;其中特别推荐千笔-AIPassPaper。 一、千笔…

Java集合(Map篇)

一.Map a.使用Map i.键值&#xff08;key-value&#xff09;映射表的数据结构&#xff0c;能高效通过key快速查找value&#xff08;元素&#xff09;。 ii.Map是一个接口&#xff0c;最常用的实现类是HashMap。 iii.重复放入k-v不会有问题&#xff0c;但是一个…

盈科巴黎办公室开业典礼暨盈科全球一小时法律服务生态圈·法国中心揭牌仪式圆满举办

国际化建设是盈科律师事务所发展的重要战略目标之一&#xff0c;随着中国对外投资、跨境贸易、“一带一路”高质量共建等迅速发展&#xff0c;越来越多中国企业和公民“走出去”&#xff0c;寻找海外市场。今年是中法建交60周年。建交以来&#xff0c;中法坚持做真诚的朋友、共…

【Java】JVM基本组成

一、JDK、JRE、JVM JDK&#xff1a;全称 “Java Development Kit” Java 开发工具包&#xff0c;提供 javac编译器、jheap、jconsole 等监控工具; JRE&#xff1a;全称 “Java Runtime Environment” Java 运行环境&#xff0c;提供 class Library 核心类库JVM; …

文件服务器FastDFS 消息队列中间件RabbitMQ

新标签页 (chinaunix.net) FastDFS - Browse Files at SourceForge.net 一、FastDFS Tracker和Storage&#xff1a; tracker用来管理所有的storage&#xff0c;只是管理服务器&#xff0c;负责负载均衡。 storage是存储服务器&#xff0c;每一个storage服务器都是一个单独的个…