python上下文管理器

DAY 23. python上下文管理器

Python 的 with 语句支持通过上下文管理器所定义的运行时上下文这一概念。 此对象的实现使用了一对专门方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文:

实现了__enter__()__exit__(exc_type, exc_val, exc_tb)方法的对象就是上下文管理器,上下文管理器可以被with支持。

class Demo:def __init__(self):print("init")def __enter__(self):print("enter")def __exit__(self, exc_type, exc_val, exc_tb):print("exit")if __name__ == '__main__':demo = Demo()with demo:print("with")

__enter__()的返回值将会赋值给与with配套使用的as后面的变量,__exit__()如果返回True会忽略with中抛出的所有异常,返回False(默认)会向下传递异常,三个参数exc_type, exc_val, exc_tb分别表示捕捉到的异常类型,异常值,回溯信息,没有异常为None。其行为类似于try,finally语句,不管有没有产生异常,exit一定会被执行。

class Demo:def __init__(self):print("init")def __enter__(self):print("enter")return selfdef __exit__(self, exc_type, exc_val, exc_tb):print(exc_type, exc_val, exc_tb)print("exit")if __name__ == '__main__':demo = Demo()with demo as d:print(d)raise IOError("主动抛出异常")print("with")

结果:

Traceback (most recent call last):
initFile "E:/桌面文件/笔记/Note/Python/总结/code/DAY23/DAY23_1.py", line 18, in <module>
enterraise IOError("主动抛出异常")
<__main__.Demo object at 0x00000243B4005908>
OSError: 主动抛出异常
<class 'OSError'> 主动抛出异常 <traceback object at 0x00000243BAEDD048>
exit

__exit__() return True后的运行结果

init
enter
<__main__.Demo object at 0x00000183AFDA11D0>
<class 'OSError'> 主动抛出异常 <traceback object at 0x00000183B6E6F908>
exit

传入的异常绝对不应当被显式地重新引发 —— 相反地,此方法应当返回一个假值以表明方法已成功完成并且不希望屏蔽被引发的异常.
这允许上下文管理代码方便地检测 __exit__() 方法是否确实已失败。

generator与contextlib.contextmanager

Python 的 generatorcontextlib.contextmanager 装饰器提供了实现这些协议的便捷方式。 如果使用 contextlib.contextmanager 装饰器来装饰一个生成器函数,它将返回一个实现了必要的 __enter__() and __exit__() 方法的上下文管理器,而不再是由未经装饰的生成器函数所产生的迭代器。

contextlib.contextmanager 是一个装饰器,它可以不用定义类或__enter__()__exit__(exc_type, exc_val, exc_tb)方法而产生一个上下文管理器,被装饰的函数必须是一个生成器对象,并且这个迭代器只能yield出一个对象,它会被绑定到with语句as后面的变量上

from contextlib import contextmanager@contextmanager
def my_open(path: str, mode: str):# 之所以之捕捉了yield语句的异常,是因为我们只希望如果with语句块中# 产生了异常,也可以确保close()被执行,至于open可能抛出的异常,我们希望它# 能够向下传递。fp = open(path, mode)try:yield ffinally:print("close the file")fp.close()if __name__ == '__main__':with my_open('01.txt', 'w') as fp:raise OSErrorfp.write("111")

代码执行顺序是:

  1. 执行yield之前的语句
  2. yield调用后执行with中的代码块
  3. 最后执行yield之后的语句

closing()

closing()是contextlib中的一个方法,用来把一个不是上下文对象的方法变成上下文对象,也是用contextmanage实现的,一个官方的栗子

from contextlib import closing
from urllib.request import urlopenwith closing(urlopen('http://www.python.org')) as page:for line in page:print(line)

不用显式调用page.close()也能确保执行

suppress()

可以选择禁止一个或多个异常

if __name__ == '__main__':with suppress(OSError):with my_open('01.txt', 'r') as fp:# 抛出的这个异常会被忽略raise OSErrorfp.write("111")

redirect_stdout/redirect_stderr

重定向输入输出

# 将输出重定向到文件from contextlib import redirect_stdoutpath = "test/test.txt"with open(path,"w") as fobj:with redirect_stdout(fobj):help(open)

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

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

相关文章

勾股定理python思路_趣叮咚编程数学揭秘:为什么勾股定理a+b=c?

我们都知道&#xff1a;三角形3个外角之和360度可是谁知道为什么等于360度呢&#xff1f;其实利用编程制作动图演绎了解啦&#xff1a;那勾股定理abc又是为什么呢&#xff1f;还有很多有趣的数学公式都可以演绎&#xff1a;圆的面积公式、圆周长...通过动图演绎原来晦涩难懂的定…

System.InvalidOperationException : 不应有 Response xmlns=''。

xml如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <Response version"2"><datacash_reference>4700203048783633</datacash_reference><information>Failed to identify the card scheme of the supp…

Navicat Premium连接SQL Server

Navicat Premium连接SQL Server 步骤&#xff1a; 激活SQL Server 服务配置SQL Server网络配置连接SQL Server 激活SQLServer服务 直接搜索 计算机管理 点 服务和应用程序&#xff0c; 点 SQL Server配置管理器&#xff0c; 双击第一个SQL Server服务 不出意外的话&#xf…

mysql 单标递归_MySql8 WITH RECURSIVE递归查询父子集的方法

背景开发过程中遇到类似评论的功能是&#xff0c;需要时用查询所有评论的子集。不同数据库中实现方式也不同&#xff0c;本文使用Mysql数据库&#xff0c;版本为8.0Oracle数据库中可使用START [Param] CONNECT BY PRIORMysql 中需要使用 WITH RECURSIVE需求找到name为张三的孩子…

processon完全装逼指南

一、引言 作为一名IT从业者&#xff0c;不仅要有扎实的知识储备&#xff0c;出色的业务能力&#xff0c;还需要具备一定的软实力。软实力体现在具体事务的处理能力&#xff0c;包括沟通&#xff0c;协作&#xff0c;团队领导&#xff0c;问题的解决方案等&#xff0c;这些能力在…

mysql在空闲8小时之后会断开连接(默认情况)

调试程序的过程发现&#xff0c;在mysql连接空闲一定时间&#xff08;默认8小时&#xff09;之后会断开连接&#xff0c;需要重新连接&#xff0c;也引发我对重连机制的思考。转载于:https://www.cnblogs.com/ppzbty/p/5707576.html

selector多路复用_多路复用器Selector

Unix系统有五种IO模型分别是阻塞IO(blocking IO)&#xff0c;非阻塞IO( non-blocking IO)&#xff0c;IO多路复用(IO multiplexing)&#xff0c;信号驱动(SIGIO/Signal IO)和异步IO(Asynchronous IO)。而IO多路复用通常有select&#xff0c;poll&#xff0c;epoll&#xff0c;k…

解决svn log显示no author,no date的方法之一

只要把svnserve.conf中的anon-access read 的read 改为none&#xff0c;也不需要重启svnserve就行 sh-4.1# grep "none" /var/www/html/svn/pro/conf/svnserve.conf ### and "none". The sample settings below are the defaults. anon-access none转载…

REST framework 权限管理源码分析

REST framework 权限管理源码分析 同认证一样&#xff0c;dispatch()作为入口&#xff0c;从self.initial(request, *args, **kwargs)进入initial() def initial(self, request, *args, **kwargs):# .......# 用户认证self.perform_authentication(request)# 权限控制self.che…

解决larave-dompdf中文字体显示问题

0、使用MPDF dompdf个人感觉没有那么好用&#xff0c;最终的生产环境使用的是MPDF&#xff0c;github上有文档说明。如果你坚持使用&#xff0c;下面是解决办法。可以明确的说&#xff0c;中文乱码是可以解决的。 1、安装laravel-dompdf依赖。 Packagist&#xff1a;https://pa…

mfc程序转化为qt_小峰的QT学习笔记

我的专业是输电线路&#xff0c;上个学期&#xff0c;我们开了一门架空线路设计基础的课&#xff0c;当时有一个大作业是计算线路的比载&#xff0c;临界档距&#xff0c;弧垂最低点和安装曲线。恰逢一门结课考试结束&#xff0c;大作业ddl快到&#xff0c;我和另外两个同专业的…

MS SQL的存储过程

-- -- Author: -- Create date: 2016-07-01 -- Description: 注册信息 -- ALTER PROCEDURE [dbo].[sp_MebUser_Register]( UserType INT, MobileNumber VARCHAR(11), MobileCode VARCHAR(50), LoginPwd VARCHAR(50), PayPwd VARCHAR(50), PlateNumber VARCHAR(20), UserTr…

mysql 中 all any some 用法

-- 建表语句 CREATE TABLE score(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),SUBJECT VARCHAR(20),score INT);-- 添加数据 INSERT INTO score VALUES (NULL,张三,语文,81), (NULL,张三,数学,75), (NULL,李四,语文,76), (NULL,李四,数学,90), (NULL,王五,语文,81), (…

REST framework 用户认证源码

REST 用户认证源码 在Django中&#xff0c;从URL调度器中过来的HTTPRequest会传递给disatch(),使用REST后也一样 # REST的dispatch def dispatch(self, request, *args, **kwargs):""".dispatch() is pretty much the same as Djangos regular dispatch,but w…

scrapyd部署_如何通过 Scrapyd + ScrapydWeb 简单高效地部署和监控分布式爬虫项目

来自 Scrapy 官方账号的推荐需求分析初级用户&#xff1a;只有一台开发主机能够通过 Scrapyd-client 打包和部署 Scrapy 爬虫项目&#xff0c;以及通过 Scrapyd JSON API 来控制爬虫&#xff0c;感觉 命令行操作太麻烦 &#xff0c;希望能够通过浏览器直接部署和运行项目专业用…

最长上升子序列 (LIS算法(nlong(n)))

设 A[t]表示序列中的第t个数&#xff0c;F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度&#xff0c;初始时设F [t] 0(t 1, 2, ..., len(A))。则有动态规划方程&#xff1a;F[t] max{1, F[j] 1} (j 1, 2, ..., t - 1, 且A[j] < A[t])。 现在&#xff0c;我们仔细…

牛顿插值--python实现

from tabulate import tabulate import sympy""" 牛顿插值法 """class NewtonInterpolation:def __init__(self, x: list, y: list):self.Xi = xself

css摇曳的_HTML5+CSS3实现树被风吹动摇晃

1新建html文档。2书写hmtl代码。3书写css代码。.trunk, .trunk div { background: #136086; width: 100px; height: 10px; position: absolute; left: 50%; top: 70%; margin-left: -10px; -webkit-animation-name: rot; animation-name: rot; -webkit-animation-duration: 2.0…

素数路(prime)

素数路(prime) 题目描述 已知一个四位的素数&#xff0c;要求每次修改其中的一位&#xff0c;并且要保证修改的结果还是一个素数&#xff0c;还不能出现前导零。你要找到一个修改数最少的方案&#xff0c;得到我们所需要的素数。 例如把1033变到8179&#xff0c;这里是一个最短…

python多线程单核_002_Python多线程相当于单核多线程的论证

很多人都说python多线程是假的多线程!下面进行论证解释:一、我们先明确一个概念&#xff0c;全局解释器锁(GIL)Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中&#xff0c;同时只有一个线程在执行&#xff0c;就像单CPU的系统中运行多个进…