我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中with上下文管理协议的作用及用法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中with上下文管理协议的作用及用法

1、简介

       with是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try…except…finlally的处理流程。

       那我们先理解一下try…except…finally语句是干啥的。实际上,try…except语句和try…finally语句是两种语句,用于不同的场景。但是当二者结合在一起时,可以“实现稳定性和灵活性更好的设计”。

2、try… except语句

       用于处理程序执行过程中的异常情况,比如语法错误、从未定义变量上取值等等,也就是一些python程序本身引发的异常、报错。而try… except语句就是为了防止一些报错影响你的程序继续运行,就用try语句把它们抓出来(捕获)。

(1)try…except的标准格式

try:  
    ## normal block  
except A:  
    ## exc A block  
except:  
    ## exc other block  
else:  

(2)程序执行流程

–>执行normal block
–>发现有A错误,执行 exc A block(即处理异常)
–>结束
如果没有A错误呢?
–>执行normal block
–>发现B错误,开始寻找匹配B的异常处理方法,发现A,跳过,发现except others(即except:),执行exc other block
–>结束
如果没有错误呢?
–>执行normal block
–>全程没有错误,跳入else 执行noError block
–>结束

(3)异常分类

       except后面还能跟表达式的! 所谓的表达式,就是错误的定义。也就是说,我们可以捕捉一些我们想要捕捉的异常。而不是什么异常都报出来。

异常分两类:

  • python标准异常
  • 自定义异常

(a)Python标准异常

      Python标准异常包括NameError(未声明/初始化对象,没有属性),MemoryError内存溢出错误等错误,

详细python标准异常详见:

异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是输入^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器(generator)发生异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最大限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达EOF 标记
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
WindowsError系统调用失败
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxErrorPython 语法错误
IndentationError缩进错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的参数
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告

例:

   try:
        a = 1 / 2
        print(a)
        print(m)  # 此处抛出python标准异常
        b = 1 / 0  # 此后的语句不执行
        print(b)
        c = 2 / 1
        print(c)
    except NameError:
        print("Ops!!")
    except ZeroDivisionError:
        print("Wrong math!!")
    except:
        print("Error")

输出:

3、try…finallly语句

       try…finallly语句用于无论执行过程中有没有异常,都要执行清场工作。

格式:

try:  
    execution block  ##正常执行模块  
except A:  
    exc A block ##发生A错误时执行  
except B:  
    exc B block ##发生B错误时执行  
except:  
    other block ##发生除了A,B错误以外的其他错误时执行  
else:  
    if no exception, jump to here ##没有错误时执行  
finally:  
final block  ##总是执行  

tips: 注意顺序不能乱,否则会有语法错误。如果用else就必须有except,否则会有语法错误。

例:   

  try:
        a = 1 / 2
        print(a)
        print(m)  # 抛出NameError异常
        b = 1 / 0
        print(b)
        c = 2 / 1
        print(c)
    except NameError:
        print("Ops!!")  # 捕获到异常
    except ZeroDivisionError:
        print("Wrong math!!")
    except:
        print("Error")
    else:
        print("No error! yeah!")
    finally:  # 是否异常都执行该代码块
        print("finally!")

输出:

4、with…as语句

(1)With语句的基本语法

       with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常。其中__enter__()方法在语句体(with语句包裹起来的代码块)执行之前进入运行,__exit__()方法在语句体执行完毕退出后运行。

       with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

With语句的基本语法格式:

with expression [as target]:
with-block  
  • expression:是一个需要执行的表达式;
  • target:是一个变量或者元组,存储的是expression表达式执行返回的结果,可选参数。

(2)with语句原理

  • 上下文管理协议(Context Management Protocol):包含方法 __enter__()和__exit__(),支持该协议的对象要实现这两个方法。
  • 上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__()和__exit__()方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。

例:执行过程

with EXPR as VAR:
    BLOCK

(1)执行EXPR,生成上下文管理器context_manager

(2)获取上下文管理器的__exit()__方法,并保存起来用于之后的调用;

(3)调用上下文管理器的__enter__()方法;如果使用了as子句,则将__enter__()方法的返回值赋值给as子句中的VAR;

(4)执行BLOCK中的表达式;

(5)不管是否执行过程中是否发生了异常,执行上下文管理器的__exit__()方法,__exit__()方法负责执行“清理”工作,如释放资源等。如果执行过程中没有出现异常,或者语句体中执行了语句break/continue/return,则以None作为参数调用__exit__(None, None, None);如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback);

(6)出现异常时,如果__exit__(type, value, traceback)返回False,则会重新抛出异常,让with之外的语句逻辑来处理异常,这也是通用做法;如果返回True,则忽略异常,不再对异常进行处理。

这个和try finally函数有什么关系呢?其实,这样的过程等价于:

try:  
    执行 __enter__的内容  
    执行 with_block.  
finally:  
    执行 __exit__内容  

例:

class Sample(object):
 
    def __init__(self):
        print("__init__")
 
    def __enter__(self):
        print("__enter__")
 
    def __exit__(self, types, values, trace):
        print("type:", types)
        print("value:", values)
        print("trace:", trace)
 
 
def get_sample():
    return Sample()
 
 
if __name__ == '__main__':
    # get_data()
    with get_sample() as sample:
        print("Sample:", sample)

输出:

到此这篇关于Python中with上下文管理协议的作用及用法的文章就介绍到这了,更多相关Python中with用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!               

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中with上下文管理协议的作用及用法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python with和上下文管理工具怎么用

这篇文章主要介绍了Python with和上下文管理工具怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python with和上下文管理工具怎么用文章都会有所收获,下面我们一起来看看吧。前言如果你有阅读源
2023-06-27

Python上下文管理器的本质及用法是什么

今天就跟大家聊聊有关Python上下文管理器的本质及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 上下文管理器是什么?举个例子,你在写Python代码的时候经常将一系
2023-06-17

Python上下文管理器的作用是什么

本篇内容介绍了“Python上下文管理器的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明1、上下文管理器允许在需要时准确分配和
2023-06-20

详解Python中contextlib上下文管理模块的用法

咱们用的os模块,读取文件的时候,其实他是含有__enter__ __exit__ 。 一个是with触发的时候,一个是退出的时候。with file('nima,'r') as f:print f.readline()那咱们自己再实现一
2022-06-04

正确理解python中的关键字“with”与上下文管理器

前言 如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 “with” 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器。 对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行
2022-06-04

Python中的with语句与上下文管理器学习总结

0、关于上下文管理器 上下文管理器是可以在with语句中使用,拥有__enter__和__exit__方法的对象。with manager as var:do_something(var)相当于以下情况的简化:var = manager._
2022-06-04

怎么在python中使用上下文管理

本篇文章为大家展示了怎么在python中使用上下文管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型
2023-06-14

MySQL中的.ibd文件作用及管理方法

MySQL中的.ibd文件作用及管理方法在MySQL中,每个数据库表都会对应一个.ibd文件,这个文件承载着表中的实际数据。.ibd文件的作用非常重要,它存储了表的数据和索引信息,属于InnoDB存储引擎特有的文件类型。在数据库管理中,正
MySQL中的.ibd文件作用及管理方法
2024-03-14

Python上下文管理器是什么及怎么使用

这篇“Python上下文管理器是什么及怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python上下文管理器是什么及
2023-07-06

如何在python中使用上下文管理器

如何在python中使用上下文管理器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pytho
2023-06-14

Python标准模块--ContextManager上下文管理器的具体用法

写代码时,我们希望把一些操作放到一个代码块中,这样在代码块中执行时就可以保持在某种运行状态,而当离开该代码块时就执行另一个操作,结束当前状态;所以,简单来说,上下文管理器的目的就是规定对象的使用范围,如果超出范围就采取“处理”。 这一功能是
2022-06-04

Python中的装饰器和上下文管理器是如何工作的?

Python中的装饰器和上下文管理器是如何工作的?在Python中,装饰器和上下文管理器是两个非常有用的概念和功能。它们都是为了简化代码、增加代码可读性以及方便代码的重用。一、装饰器装饰器是Python中一种用于修改函数的行为的特殊函数。它
2023-10-22

JavaScript 中 this 关键字的作用及改变其上下文的方法

这篇文章主要介绍了JavaScript 中 this 关键字的作用和如何改变其上下文,通过使用 call, apply, bind 方法,可以改变函数中的 this 指向,从而在不同的上下文中使用同一个函数,需要的朋友可以参考下
2023-01-28

Python中的装饰器和上下文管理器的原理和使用场景是什么?

Python中的装饰器和上下文管理器是两个非常有用的特性,它们可以帮助我们更好地组织和管理代码,并提高代码的可复用性。本文将分别介绍装饰器和上下文管理器的原理和使用场景,并给出具体的代码示例。一、装饰器的原理和使用场景原理:装饰器是一种在不
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录