with上下文管理器(Python)---------------------落雨成风

Python进阶之-上下文管理器 本文介绍了Python中的上下文管理器,包括其基本概念、组成、标准库中的应用、自定义上下文管理器的实现以及contextlib模块的使用。重点强调了上下文管理器在资源管理、异常处理和代码整洁性方面的优势。 阅读详情

关于with上下文管理器的一些小总结:

没有使用with打开文件的时候:

def m1():
    f = open("output.txt", "w")
    f.write("python之禅")
    f.close()

这样写有一个潜在的问题,如果在调用 write 的过程中,出现了异常进而导致后续代码无法继续执行,close 方法无法被正常调用,因此资源就会一直被该程序占用者释放。

使用with打开文件:

def m3():
    with open("output.txt", "r") as f:
        f.write("Python之禅")

可以看到 我们的代码量明显减少,而且使用with有一个明显的优点:当我们打开一个文件进行操作的时候,不用手动关闭文件,with会自动调用open里面的上下文管理器进行关闭,当打开文件进行操作的时候,有误操作报错的时候,with也可以帮助我们将文件正常关闭,这就避免了资源的浪费。

实现上下文管理器

任何实现了 __ enter__() 和 __ exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器协议。

class File():

    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        print("entering")
        self.f = open(self.filename, self.mode)
        return self.f

    def __exit__(self, *args):
        print("will exit")
        self.f.close()

__ enter__() 方法返回资源对象,这里就是你将要打开的那个文件对象,__ exit__() 方法处理一些清除工作。

因为 File 类实现了上下文管理器,现在就可以使用 with 语句了。

with File('out.txt', 'w') as f:
    print("writing")
    f.write('hello, python')

这样,你就无需显示地调用 close 方法了,由系统自动去调用,哪怕中间遇到异常 close 方法也会被调用。

另外,with 不仅可以用在打开文件上,所有打开操作,只要里面包含__enter __ 和 __ exit__方法,都可以使用with触发

总结:

with 是用来触发上下文管理器的方法,我们使用这个方法可以避免打开文件进行操作时,误操作出现错误无法关闭文件造成的资源浪费,with不仅可以使用在打开文件上,所有打开操作,内部只要存在__enter __ 和 __ exit__方法,都可以使用with触发

Python文件操作的“保险箱”:with语句深度实战指南 print(f"操作异常: {exc_val}")return True # 抑制异常传播# 使用示例f.write("临时数据")raise ValueError("测试异常抑制")此案例中,自定义管理器不仅实现了文件的自动关闭,还在__exit__()中捕获了异常并选择抑制传播。这种模式可扩展至临时文件清理、网络连接池管理等场景。优先使用内置管理器Python标准库已为文件、锁、线程池等常见资源提供了优化过的上下文管理器,直接使用可避免重复造轮子。异常处理要明确。 阅读详情

相关推荐

python实现ECMS算法

ECMS(Equivalent Consumption Minimization Strategy)算法是一种用于混合动力汽车能量管理系统的优化策略。它通过计算等效油耗来平衡电池电量消耗和燃油消耗,从而优化整体能耗。以下是一个简单的Python实现,用于演示ECMS算法的基本思想。这个实现假设了一个简单的混合动力汽车模型,其中电池电量和燃油消耗是主要的优化目标。

weixin_45570158的博客 923

Python上下文管理器with深入讲解

Python编程时用到with上下文管理器的地方很多,但大多数人只知道怎么用却没有深入了解它。在此我尝试对Python上下文管理器with进行深入讲解,希望能帮到大家更好和更深入地掌握with的用法。 with作用 with语句是上下文管理器,上下文管理器(是一个对象)定义了在进入和退出with语句时需要执行上下文代码块。完整的上下文管理器必须有以下两个方法: object.__enter__(self) 进入with语句块时会自动运行该对象的__enter__方法,如果有as子句那么with语句将将此方法

m0_47670683的博客 652

Vue3实战:集成bpmn-js与Activiti工作流引擎的完整指南

本文详细介绍了如何在Vue3项目中集成bpmn-js流程图编辑器与Activiti工作流引擎,构建一个完整的前端流程设计器。文章重点解析了Vue3响应式系统与bpmn-js集成的核心陷阱及解决方案,并提供了属性面板配置、XML命名空间适配、撤销重做等实用功能的完整实现指南,帮助开发者高效完成工作流系统的前端开发。

weixin_29009881的博客 213

Python使用with语句管理文件上下文

通过本文的介绍,你应该对使用with语句管理文件上下文有了全面的了解。with语句是 Python 中一种优雅的资源管理方式,能够自动管理资源的分配和释放,使得代码更加简洁、安全和可靠。在文件操作中,建议尽量使用with语句管理文件上下文,以提高代码的质量和可维护性。

weixin_55100524的博客 789

【MMDetection3.0实战】从零构建自定义数据集训练流程

本文详细介绍了使用MMDetection3.0框架从零开始构建自定义目标检测数据集的完整训练流程。内容涵盖环境配置、COCO格式数据准备、核心代码改造、模型配置与训练策略调优,以及最终的模型测试与验证,帮助开发者快速上手并训练自己的检测模型。

l6m7n8的博客 314

[pcie]gen6 下 L0p

000b~100b: 触发L0p 操作流程协商工作link width 到target link width.为111b:link width 硬件动态调整。硬件动态:Device control 3 register.target link width=111b当pcie链路检测到空闲状态时,设备可以主动进入L0p状态。L0p 是pcie gen6 新引入的链路状态,是L0的子状态。(5)LINK WIDTH:当LINK WIDTH CHANGE.cmd为Request时表示请求的链路宽度。

BIG_APPLE1的博客 1679

python的with文件操作与上下文

1.with与“上下文管理器” 带有 “with” 关键字的语句,它通常用在对于系统资源如文件、数据库连接、socket而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。 比如 Python 程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,否则会出现什么情况呢?极端情况下会出现 “Too many open files” 的错误,因为系统允许你打开...

非空盒子的博客 327

STM32基于软件模拟IIC进行AHT21B温湿度采集

通过学习软件IIC来进行实操AHT21B采集温湿度。

Liu-FE的博客 3700

Python 上下文管理器

contextlib 是 Python 的一个标准库模块,它提供了用于创建上下文管理器的装饰器和上下文管理器类。上下文管理器主要用于 with 语句,帮助自动管理资源,如文件操作、线程锁的获取与释放等,使得代码更加简洁、安全。上下文管理器协议:是指要实现对象的 __enter__() 和 __exit__() 方法。contextlib 模块中最常用的工具是。

lIujunXHU的博客 1306

同花顺API实战指南:从零搭建股票数据自动化采集系统

本文提供了一份详尽的同花顺API实战指南,手把手教你从零开始搭建股票数据自动化采集系统。内容涵盖API权限申请、Python环境配置、数据采集与存储脚本编写、自动化定时任务实现以及数据清洗等核心环节,旨在帮助量化交易与数据分析爱好者构建稳定可靠的数据源,解放双手,提升研究效率。

weixin_29200741的博客 2414

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

congge 4100

零基础部署Qwen3-ASR-1.7B:VSCode开发环境配置指南

本文介绍了如何在星图GPU平台上自动化部署Qwen3-ASR-1.7B镜像,快速构建高性能语音识别环境。依托平台能力,用户无需手动配置CUDA、Python虚拟环境或依赖库,即可一键启用该模型,典型应用于会议录音转写、多方言语音转文字等真实场景,显著降低AI语音技术落地门槛。

weixin_32869687的博客 284

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Python上下文管理器详解

Python上下文管理器是一种用于管理资源获取和释放的强大工具,通过with语句确保资源在使用后正确释放,即使发生异常。上下文管理器通过实现__enter__和__exit__方法定义进入和退出上下文时的操作。常见的实现方式包括类实现和装饰器实现,应用场景涵盖文件操作、数据库连接和临时目录管理等。此外,上下文管理器支持嵌套和异步操作,适用于复杂场景。最佳实践包括在__exit__方法中处理异常,确保资源安全释放。通过上下文管理器,开发者可以编写更简洁、健壮的代码。

embelfe_segge的博客 743

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python3 上下文管理器:优雅管理资源的艺术

想象你去图书馆借书:你进入图书馆,使用资源(阅读书籍),然后离开时确保归还所有书籍并保持一切整洁。上下文管理器就是Python中的"图书馆管理员",它帮助你自动处理资源的获取和释放过程。上下文管理器主要通过with语句实现,处理的是"上下文"——即程序运行的特定环境状态。📌核心概念:上下文管理器负责设置一个环境,让你在其中执行代码,然后无论成功或失败都能清理环境。这非常适合处理需要成对操作的场景,如打开/关闭文件、获取/释放锁、连接/断开数据库等。基于类的方法(实现__enter__和__exit__

weixin_45705239的博客 886

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Python】一文详细介绍 with关键词的作用和常见用法

🌟【Python干货】一文读懂with关键词!💪 还在为Python资源管理头疼吗?🤯 这篇博客将带你轻松掌握with关键词的精髓!从引入和作用讲起,深入剖析上下文管理协议,更教你如何自定义上下文管理器。🌟 with关键词的优雅之处,让你代码更简洁、清晰,告别繁琐资源管理!🎉 注意事项一网打尽,让你避免踩坑。展望未来,with关键词应用场景更广阔!🚀 读完这篇博客,你将轻松驾驭Python with关键词,提升编程效率!快来一起学习吧!#PythonWith关键词详解 #资源管理神器 #编程

创作高质量博文,分享知识,共同进步! 2260

python进阶(四):上下文管理器

本文详细介绍了Python上下文管理器的概念和用法。上下文管理器是一种用于管理资源的对象,可以确保在使用完资源后正确地释放和清理资源。通过合理地使用上下文管理器和with语句,你可以编写安全、可靠和易于维护的代码。

w1101662433的博客 505

Python with语句与上下文管理器使用说明

语句是 Python 中用于资源管理的强大工具,它通过上下文管理器(Context Manager)实现了优雅的资源获取与释放机制。 语句用于包装代码块的执行,允许开发者在进入和退出代码块时执行特定的操作。最常见的用途是确保文件、锁等资源在使用后被正确释放。 1.3 经典示例:文件操作 二、上下文管理器的实现原理 2.1 上下文管理器协议 上下文管理器通过实现 和 两个特殊方法来定义: 三、 模块的工具 Python 标准库中的 模块提供了创建上下文管理器的便捷方式。使用生成器函数快速创建上下文管理

qq_17275369的博客 777

Python:上下文管理器(with)

上下文管理器是实现了特定协议的Python对象,这个协议包含两个魔法方法:__enter__和__exit__。这些方法允许对象与with语句一起使用,以确保资源被适当地管理。enter你可以通过定义一个类并实现__enter__和__exit__方法来创建自定义的上下文管理器。

极光喵的博客 779

Python 上下文管理器(Context Manager)详解

上下文管理器是Python中用于管理资源分配与释放的重要机制,它通过with语句实现资源的自动管理,确保即使在代码块执行过程中发生异常,资源也能被正确释放。上下文管理器是Python中优雅管理资源的利器,掌握它可以显著提高代码的健壮性和可读性。在实际开发中,应当养成对资源操作使用with语句的习惯,这不仅能避免资源泄漏,还能使代码结构更加清晰。

Aerkui的博客 1329

Python中的上下文管理器:使用with管理成对操作,初级及高级用法解析

Python 的上下文管理器为我们提供了一种优雅、简洁且强大的方式来管理资源的获取和释放。通过实现 __enter__ 和 __exit__ 方法,或者使用 contextlib 模块的工具,我们可以在代码块的前后自动执行特定的逻辑,确保资源被正确地管理,避免资源泄漏和异常未处理等问题。

橙色小博的博客,励志在人工智能领域发光发热! 5049

python -- (魔法属性、property属性、with) --(五)

魔法属性 property属性 with

Yang_Hao_的博客 319

Python 高级(二)

多继承以及MRO顺序 1. 单独调用父类的方法 # coding=utf-8 print("******多继承使用类名.__init__ 发生的状态******") class Parent(object): def __init__(self, name): print('parent的init开始被调用') self.name = ...

weixin_34232744的博客 130

python教程:上下文管理器详细教程

我想你对 Python 中的with语句一定不陌生,尤其是在文件的读写操作中,不过我想,大部分人可能习惯了它的使用,却并不知道隐藏在其背后的“秘密”。 那么,究竟with语句要怎么用,与之相关的上下文管理器(context manager)是什么,它们之间又有着怎样的联系呢?这篇文章就为大家带来解密 什么是上下文处理器? 在任何一门编程语言中,文件的输入输出、数据库的连接断开等,都是很常见的资源管理操作。但资源都是有限的,在写程序时,我们必须保证这些资源在使用过后得到释放,不然就容易造成资源泄露,轻者使得系

Python热爱者的博客 5636

【Python】【进阶】上下文管理器

上下文管理器

yao123698745的博客 2041
上一篇: redis如何实现持久化(python)--------------------------落雨成风
下一篇: http常用的请求方法---------------落雨成风
落雨成风
博客等级 码龄8年 4粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值