python内置模块之上下文管理contextlib


Posted in Python onJune 14, 2022

Python中当我们们打开文本时,通常会是用with语句,with语句允许我们非常方便的使用资源,而不必担心资源没有关闭。

with open('/path/filename', 'r') as f:
    f.read()

然而,并不是只有open()函数返回fp对象才能使用 with 语句。实际上,任何对象,只要正确实现上下文管理,就可以使用with语句。

实现上下文管理是通过 __enter__ 和 __exit__ 这两个方法实现的。例如,下面的class实现了这两个方法:

class Query(object):
 
    def __init__(self, name):
        self.name = name
 
    def __enter__(self):
        print('Begin')
        return self
 
    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            print('Error')
        else:
            print('End')
 
    def query(self):
        print('Query info about %s...' % self.name)

这样我们可以把自己写的资源对象用于 with 语句。

with Query('Bob') as q:
    q.query()

一、@contextmanager

编写 __enter__ 和 __exit__ 仍然很繁琐,因此Python的标准库 contextlib 提供了更简单的写法,上面的代码可以改写为:

from contextlib import contextmanager
 
class Query(object):
 
    def __init__(self, name):
        self.name = name
 
    def query(self):
        print('Query info about %s...' % self.name)
 
@contextmanager
def create_query(name):
    print('Begin')
    q = Query(name)
    yield q
    print('End')

@contextmanager 这个装饰器接受一个 generator,用 yield 语句把 with ... as var 把变量输出去,然后,with 语句就可以正常的工作了:

with create_query('Bob') as q:
    q.query()

很多时候,我们希望在某段代码执行前后自动执行特定代码,也可以用 @contextmanager实现。

@contextmanager
def tag(name):
    print("<%s>" % name)
    yield
    print("" % name)
 
with tag("h1"):
    print("hello")
    print("world")

上述代码执行结果:

hello
world
</h1>

代码的执行顺序是:

  • with 语句 首先执行 yield 之前的语句,因此打印出.
  • yield 调用会执行 with 语句内部的所有语句,因此打印出 hello 和 world.
  • 最后执行yield之后的语句,打印出.

二、@closing

如果一个对象没有实现上下文,就不能使用 with 语句,但是可以用 closing() 来把对象变为上下文对象。

from contextlib import closing
from urllib.request import urlopen
 
with closing(urlopen('https://www.python.org')) as page:
    for line in page:
        print(line)

closing 也是一个经过 @contextmanager 装饰的generator

@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

它的作用就是把任意对象变为上下文对象,并支持 with语句。

到此这篇关于python内置模块之上下文管理contextlib的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 文件与目录操作
Dec 24 Python
使用python删除nginx缓存文件示例(python文件操作)
Mar 26 Python
python安装以及IDE的配置教程
Apr 29 Python
Python 字符串与数字输出方法
Jul 16 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
python实现名片管理系统
Nov 29 Python
把pandas转换int型为str型的方法
Jan 29 Python
python中的数组赋值与拷贝的区别详解
Nov 26 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
python实现扫雷游戏
Mar 03 Python
selenium学习教程之定位以及切换frame(iframe)
Jan 04 Python
Python时间操作之pytz模块使用详解
Django框架之路由用法
Jun 10 #Python
深入理解pytorch库的dockerfile
Jun 10 #Python
如何利用python实现列表嵌套字典取值
Jun 10 #Python
python中filter,map,reduce的作用
Jun 10 #Python
Django框架中模型的用法
Jun 10 #Python
Django框架中视图的用法
Jun 10 #Python
You might like
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php处理复杂xml数据示例
2016/07/11 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
prototype1.4中文手册
2006/09/22 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
浅析Jquery操作select
2016/12/13 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
财务主管自我鉴定
2014/01/17 职场文书
挂靠协议书范本
2014/04/22 职场文书
小区推广策划方案
2014/06/06 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
名人传读书笔记
2015/06/26 职场文书
董事长秘书工作总结
2015/08/14 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书