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写的服务监控程序实例
Jan 31 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
Django自定义用户认证示例详解
Mar 14 Python
pyhton列表转换为数组的实例
Apr 04 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
python 实现绘制整齐的表格
Nov 18 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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
我常用的几个类
2006/10/09 PHP
php生成WAP页面
2006/10/09 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
Javascript 实用小技巧
2010/04/07 Javascript
Javascript Throttle &amp; Debounce应用介绍
2013/03/19 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
HTML5新增的Css选择器、伪类介绍
2013/08/07 HTML / CSS
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
高中化学教学反思
2014/01/13 职场文书
周年庆典邀请函范文
2014/01/23 职场文书
颁奖晚会主持词
2014/03/25 职场文书
劳资协议书范本
2014/04/23 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
给老婆的检讨书
2015/01/27 职场文书
Android中的Launch Mode详情
2022/06/05 Java/Android