深入浅析python with语句简介


Posted in Python onApril 11, 2018

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语句简介,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
深入理解Python 代码优化详解
Oct 27 Python
python编程实现归并排序
Apr 14 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 Python
python实现微信自动回复功能
Apr 11 #Python
Python实现检测文件MD5值的方法示例
Apr 11 #Python
python 输出上个月的月末日期实例
Apr 11 #Python
Python简单计算文件MD5值的方法示例
Apr 11 #Python
pandas 获取季度,月度,年度首尾日期的方法
Apr 11 #Python
python+pandas生成指定日期和重采样的方法
Apr 11 #Python
python dataframe astype 字段类型转换方法
Apr 11 #Python
You might like
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
PHP 简单日历实现代码
2009/10/28 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
兼容FF和IE的动态table示例自写
2013/10/21 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
python两个list[]相加的实现方法
2020/09/23 Python
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
幼儿园国庆节活动方案
2014/02/01 职场文书
安全施工责任书
2014/08/25 职场文书
优秀员工事迹材料
2014/12/20 职场文书
综合测评个人总结
2015/03/03 职场文书
交通安全学习心得体会
2016/01/18 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫