深入浅析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 相关文章推荐
Django 生成登陆验证码代码分享
Dec 12 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
Python Flask基础教程示例代码
Feb 07 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
详解Python学习之安装pandas
Apr 16 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
python实现邮件自动发送
Aug 10 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
如何把python项目部署到linux服务器
Aug 26 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 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的类树(支持无限分类)
2006/10/09 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
2020/11/09 jQuery
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
简单的编程0基础下Python入门指引
2015/04/01 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
python Flask实现restful api service
2017/12/04 Python
python3中property使用方法详解
2019/04/23 Python
django数据库自动重连的方法实例
2019/07/21 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
Pytorch转tflite方式
2020/05/25 Python
蛋白质世界:Protein World
2017/11/23 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
春风行动实施方案
2014/03/28 职场文书
超市理货员岗位职责
2014/07/04 职场文书
会计人员演讲稿
2014/09/11 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
导游词之神仙居景区
2019/11/15 职场文书
Golang解析JSON对象
2022/04/30 Golang
MySQL存储过程及语法详解
2022/08/05 MySQL