深入浅析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中的wxPython实现最基本的浏览器功能
Apr 14 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
简单了解Python生成器是什么
Jul 02 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 Python
python爬取抖音视频的实例分析
Jan 19 Python
python基础之类方法和静态方法
Oct 24 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 字符串函数收集
2010/03/29 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
python对url格式解析的方法
2015/05/13 Python
Python玩转Excel的读写改实例
2019/02/22 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
回门宴父母答谢词
2014/01/26 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
cf战队收人广告词
2014/03/14 职场文书
诚信承诺书模板
2014/05/26 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
岗位聘任报告
2015/03/02 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
工作态度怎么写
2015/06/25 职场文书
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
SQL Server删除表中的重复数据
2022/05/25 SQL Server