contextlib是一个Python模块,作用是提供更易用的上下文管理器。

编写 __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()
 

代码的执行顺序是:

  1. with 语句 首先执行 yield 之前的语句,因此打印出 <h1>.
  2. yield 调用会执行 with 语句内部的所有语句,因此打印出 hello 和 world.
  3. 最后执行yield之后的语句,打印出 </h1>.

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

1
2
3
4
5
6
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

1
2
3
4
5
6
@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

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

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

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

最新文章

  1. Mediaplayer error (-19,0)
  2. 【转】推荐10款最热门jQuery UI框架
  3. Selenium Webdriver下click失效问题解决
  4. POJ 3071 Football
  5. Android课程---布局管理器之相对布局(二)
  6. B:冷血格斗场
  7. Java中ArrayList的自我实现
  8. Sass用法指南_20151109笔记
  9. Android EditText获取光标位置并插入字符删除字符
  10. 《CSS3秘笈》备忘录
  11. Qt 学习之路 :使用 QJson 处理 JSON
  12. HighlightingSystem插件使用(边缘发光)
  13. B/S架构与C/S架构的区别
  14. JFreeChart时间轴固定24小时每天刷新
  15. Docker+SpringBoot远程发布
  16. C# 多线程 类构造函数 类方法之间的关系
  17. Caused by: Java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;
  18. C++: 可变参数;
  19. $gopath not set的解决办法
  20. 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例

热门文章

  1. c# 自动关机代码
  2. lintcode-114-不同的路径
  3. 【bzoj4517】[Sdoi2016]排列计数 组合数+dp
  4. 【题解】APIO2013机器人
  5. BZOJ 2820: YY的GCD | 数论
  6. [Leetcode] Symmetric tree 对称二叉树
  7. number 解题报告
  8. BZOJ_day9
  9. codeforces 1015B
  10. Terminals Project