深入浅析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列表与元组详解实例
Nov 01 Python
python实现文件快照加密保护的方法
Jun 30 Python
python写入文件自动换行问题的方法
Jul 05 Python
使用python将多个excel文件合并到同一个文件的方法
Jul 09 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
PyTorch加载自己的数据集实例详解
Mar 18 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
python中操作文件的模块的方法总结
Feb 04 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中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
Vue实现仿iPhone悬浮球的示例代码
2020/03/13 Javascript
Python实现查找系统盘中需要找的字符
2015/07/14 Python
详解Python迭代和迭代器
2016/03/28 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python collections模块使用方法详解
2019/08/28 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
有机童装:Toby Tiger
2018/05/23 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
什么样的创业计划书可行性高?
2014/02/01 职场文书
统计岗位职责
2014/02/21 职场文书
社区禁毒工作方案
2014/06/02 职场文书
铅球加油稿100字
2014/09/26 职场文书
学生评语集锦
2015/01/04 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server