深入浅析python with语句简介
作者:John_Lan_2008 发布时间:2022-06-30 20:23:16
标签:python,with,语句
with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍)。with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
术语
要使用 with 语句,首先要明白上下文管理器这一概念。有了上下文管理器,with 语句才能工作。
在python中读写操作资源,最后需要释放资源。可以使用try…finally结构实现资源的正确释放,python提供了一个with语句能更简便的实现释放资源。
1. python像文件的操作open等已经可以直接使用with语句
2. 可以自定义一个支持with语句对象
3. 使用contextlib也可以使用with语句对象
4. 针对需要close操作的对象with的使用
示例代码中有4种使用标注
# 自定义支持with语句的对象
class DummyRes:
def __init__(self, tag):
self.tag = tag
def __enter__(self):
print("Enter >>> {}".format(self.tag))
return self
def __exit__(self, exc_type, exc_value, exc_tb):
print("Exit <<< {}".format(self.tag))
if exc_tb is None:
print("Exit without Exception {}".format(self.tag))
return False
else:
print("Exit with Exception {}".format(self.tag))
return True
# 支持closing 上下文with语句对象
class Closing:
def __init__(self, thing):
self.thing = thing
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, exc_tb):
self.thing.close()
class ClosingDemo:
def __init__(self):
self.acquire()
def acquire(self):
print("Acquire RES")
def close(self):
print("Close RES")
from contextlib import contextmanager
class ContextDemo:
def __init__(self):
print("Context Demo init")
raise Exception
print("Context Demo init")
def print(self):
print("Context Demo print 1")
#raise Exception
print("Context Demo print 2")
def close(self):
print("Context Demo close")
def context_demo():
print("context demo in")
raise Exception
print("context demo out")
@contextmanager
def demo():
print("Allocate Resoures")
try:
yield context_demo
finally:
print("raise exception")
#yield "*** contextmanager demo ***"
print("Free Resoures")
if __name__ == "__main__":
# 1. 使用with语句 (自动关闭文件)
with open("test.txt", "w") as f:
f.write("write test")
# 2. 自动定义with语句
with DummyRes("test") as res:
print("With body 1")
raise Exception
print("With body 2")
# 3. 利用contextlib定义with语句
with demo():
print("exc demo")
# 4. closing 上下文 (适合有close操作的情况)
with Closing(ClosingDemo()):
print("Use Resoures")
总结
以上所述是小编给大家介绍的python with语句简介网站的支持!
来源:https://blog.csdn.net/John_Lan_2008/article/details/79880781
0
投稿
猜你喜欢
- 除了使用 sys.exc_info() 方法获取更多的异常信息之外,还可以使用 traceback 模块,该模块可以用来查看异常的传播轨迹,
- 第一章:基本的圆角框第二章:透明圆角化背景图片第三章:圆角化图片 第四章:CSS圆角框组件 V1.0序言:在我的文章《超圆滑圆角框的半完美解
- 如今大部分网站仍然采用表格嵌套内容的方式来制作网站,虽然此方法对于我们来说比较熟悉、比较上手;但是,它却阻碍了一种更好的、更有亲和力的、更灵
- 本文实例讲述了Python装饰器decorator用法。分享给大家供大家参考。具体分析如下:1. 闭包(closure)闭包是Python所
- 测试环境为Windows 10 系统,Python3.7,转换需要提前安装pydub、ffmpeg,安装和加入环境变量配置方法自行解决,至于
- 扪心自问,你真正了解你卖给用户的是什么玩意么?你所认为革命性的,一定会震惊世界的功能、特色,用户真的买单么?我的意思是,我们总是习惯性的忘记
- 本系列教程我们将使用python实现一些简单的测试工具,为了尽可能的简单,我们的工具以命令行工具为主。本系列教程使用的python版本是3.
- 这些天,我需要全文搜索。这个区块中最酷的孩子们是Elastic Search和Sorl:他们快速,灵活,资源消耗沉重并且需要Java,这几乎
- 如果想单独取background-position的X值或Y值,IE里可以通过私有属性background-positionX或者backg
- 前言Pandas是Python下一个开源数据分析的库,它提供的数据结构DataFrame极大的简化了数据分析过程中一些繁琐操作。1. 基本使
- 音乐播放器可让您快速轻松地管理和收听所有音乐文件。在本文中,我将带您了解如何使用 Python 创建音乐播放器 GUI。如何使用 Pytho
- 首先我们解压$ unzip p8202632_10205_LINUX.zip解压后我们会发现多出了个文件夹,他是:Disk1,进入Disk1
- 通过phpmyadmin连接mysql数据库时提示:“2003 无法登录 MySQL服务器”。。。很明显这是没有启动mysql服务,右击我的
- 本文实例讲述了Python实现小数转化为百分数的格式化输出方法。分享给大家供大家参考,具体如下:比如将 0.1234 转化为 12.34%
- 本文实例讲述了php基于协程实现异步的方法。分享给大家供大家参考,具体如下:github上php的协程大部分是根据这篇文章实现的:http:
- (1)、back_log:要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程
- 在这个由两部分组成的系列文章的第二部分中,我们将继续探索如何将函数式编程方法中的好想法引入到 Python中,以实现两全其美。在上一篇文章中
- 3. 品味“决定”艺术作品的好坏,设计的好坏则来自主观意见我们在鉴赏艺术作品时,用看法来表达当时的感觉,而你的品味则会左右你的看法。以一个有
- 前言PyCharm是一种Python 的IDE工具(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,内部
- 在 Django 网站中使用 mailgun 的邮件收发服务。1.在 mailgun 官网上注册个账号(免费,免费账号每个月有10000条收