深入浅析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中的pydoc模块和distutils模块
Apr 13 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
scrapy爬虫实例分享
Dec 28 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
python http基本验证方法
Dec 26 Python
通过PYTHON来实现图像分割详解
Jun 26 Python
python调用自定义函数的实例操作
Jun 26 Python
python+rsync精确同步指定格式文件
Aug 29 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
pytorch训练神经网络爆内存的解决方案
May 22 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完整的日历类(CLASS)
2006/11/27 PHP
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php SQL之where语句生成器
2009/03/24 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
JS打印彩色菱形的实例代码
2018/08/15 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
JS判断数组里是否有重复元素的方法小结
2019/05/21 Javascript
详解C++编程中一元运算符的重载
2016/01/19 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
会计专业自荐信范文
2013/12/02 职场文书
岗位说明书范文
2014/05/07 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
员工升职自我评价
2019/03/26 职场文书