8.python之上下文管理协议

简介:

使用上下文管理协议,有什么好处?

  1. 使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预。

  2. 在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处。


之前所提到的with代码块,就是python的上下文管理操作,比如说通过python打开一个文件,就可以通过with代码块结合open去实现,通过这种方式打开的文件,执行了相应的操作后,无需我们手动去close文件,文件就会自动关闭。

比如:

with open('a.txt') as f:

'代码块'

#上面这个例子,就是一个上下文管理协议,即with语句,为了让一个对象可以去兼容with语句,则必须在这个对象的类中,去声明__enter__和__exit__方法。

这种上下文的管理,就是通过类中的__enter__和__exit__这两个内置方法去实现的。


下面是__enter__和__exit__的用法示例:

class test:

    def __init__(self,name):

        self.name = name

    def __enter__(self):

        #print "只要with语句一出现,这个对象的__enter__方法就会被触发,__enter__这个方法的返回值会赋值给as 后面声明的变量"

        print "我是__enter__方法,with出现时就会执行我~"

    def __exit__(self, exc_type, exc_val, exc_tb):

        print "我是__exit__方法,__enter__执行完毕会执行我"

with test(123) as t1:

    print "aaaa"


我们来看看输出结果:

我是__enter__方法,with出现时就会执行我~

aaaa

我是__exit__方法,__enter__执行完毕会执行我


#__exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行。

#传入__exit__方法中的exc_type,exc_val,exc_tb,分别是(异常类,异常的值,追踪信息)这三个参数只有当__enter__方法或者with下的代码块下的代码出现异常,这三个参数才会有值,否则就是三个None。

#__exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行,直接开始执行__exit__方法。


关于上下文管理的异常处理:

class Open:

    def __init__(self,name):

        self.name=name

    def __enter__(self):

        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):

        print('with中代码块执行完毕时执行我啊')

        print(exc_type)

        print(exc_val)

        print(exc_tb)

with Open('a.txt') as f:

    print('=====>执行代码块')

    raise AttributeError('***着火啦,救火啊***')

print('0'*100) #------------------------------->不会执行

从上面这个例子可以看出来,当with的代码块的执行出现异常的时候,python会直接开始执行对象的__exit__方法,当__exit__内的方法也执行完毕,整个程序就终止掉了。


那么,如何处理with代码块中的异常呢?

注意看下面这个例子!!


class Open:

    def __init__(self,name):

        self.name=name

    def __enter__(self):

        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):

        print('with中代码块执行完毕时执行我啊')

        print(exc_type)

        print(exc_val)

        print(exc_tb)

        return True        #注意这里!!!!

with Open('a.txt') as f:

    print('=====>执行代码块')

    raise AttributeError('***着火啦,救火啊***')

print('0'*100) #------------------------------->会执行



当__exit__方法,返回的为值True时,就好像啥都没发生一样,with后的语句正常执行,with代码块中的异常被屏蔽掉了!!


最后关于python的上下文管理,做一个总结:

  1. 在没有任何异常的情况下,整个代码块的内容运行完毕后会去触发对象的__exit__方法,它的三个参数都为None。

  2. 当有异常存在的情况下,从异常位置,直接触发__exit__。

    2.1 当手动将__exit__方法的返回值修改为True,with语句就会屏蔽掉异常。

    2.2 当__exit__的返回值不为True,在with代码块中遇到异常就会抛出。

    2.3 当__exit__这个方法一旦运行完毕,就代表了整个with语句执行完毕。






      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1918647,如需转载请自行联系原作者



相关文章
|
5月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
96 4
|
2月前
|
测试技术 网络安全 数据安全/隐私保护
Paramiko是一个用于处理SSHv2协议的Python库
Paramiko是一个用于处理SSHv2协议的Python库
37 3
|
3月前
|
数据采集 JSON API
🎓Python网络请求新手指南:requests库带你轻松玩转HTTP协议
本文介绍Python网络编程中不可或缺的HTTP协议基础,并以requests库为例,详细讲解如何执行GET与POST请求、处理响应及自定义请求头等操作。通过简洁易懂的代码示例,帮助初学者快速掌握网络爬虫与API开发所需的关键技能。无论是安装配置还是会话管理,requests库均提供了强大而直观的接口,助力读者轻松应对各类网络编程任务。
127 3
|
3月前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
61 2
|
3月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
77 3
|
3月前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
90 8
|
2月前
|
缓存 网络协议 Linux
Python渗透测试之ARP毒化和协议应用
Python渗透测试之ARP毒化和协议应用
38 0
|
3月前
|
Python
HTTP协议不再是迷!Python网络请求实战,带你走进网络世界的奥秘
本文介绍了HTTP协议,它是互联网信息传递的核心。作为客户端与服务器通信的基础,HTTP请求包括请求行、头和体三部分。通过Python的`requests`库,我们可以轻松实现HTTP请求。本文将指导你安装`requests`库,并通过实战示例演示如何发送GET和POST请求。无论你是想获取网页内容还是提交表单数据,都能通过简单的代码实现。希望本文能帮助你在Python网络请求的道路上迈出坚实的一步。
78 0
|
4月前
|
安全 数据库连接 数据库
Python深度解析:上下文协议设计与应用技巧
在Python编程中,资源管理是一个常见且重要的问题。无论是文件操作、网络连接还是数据库事务,都需要确保资源在使用后能够正确地释放或恢复到初始状态。Python通过上下文管理器提供了一种优雅的方式来处理资源的获取与释放,使得代码更加简洁、安全。