python的上下文管理(contextlib)(2)
2024-09-23 17:06:51
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()
代码的执行顺序是:
- with 语句 首先执行 yield 之前的语句,因此打印出 <h1>.
- yield 调用会执行 with 语句内部的所有语句,因此打印出 hello 和 world.
- 最后执行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() |
最新文章
- Mediaplayer error (-19,0)
- 【转】推荐10款最热门jQuery UI框架
- Selenium Webdriver下click失效问题解决
- POJ 3071 Football
- Android课程---布局管理器之相对布局(二)
- B:冷血格斗场
- Java中ArrayList的自我实现
- Sass用法指南_20151109笔记
- Android EditText获取光标位置并插入字符删除字符
- 《CSS3秘笈》备忘录
- Qt 学习之路 :使用 QJson 处理 JSON
- HighlightingSystem插件使用(边缘发光)
- B/S架构与C/S架构的区别
- JFreeChart时间轴固定24小时每天刷新
- Docker+SpringBoot远程发布
- C# 多线程 类构造函数 类方法之间的关系
- Caused by: Java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;
- C++: 可变参数;
- $gopath not set的解决办法
- 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例