博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python的上下文管理(contextlib)(2)
阅读量:5274 次
发布时间:2019-06-14

本文共 1241 字,大约阅读时间需要 4 分钟。

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) @contextmanagerdef 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()

转载于:https://www.cnblogs.com/aomi/p/7353939.html

你可能感兴趣的文章
读书笔记十四:TCP/IP详解之TCP的成块数据流
查看>>
设计模式(四)多例模式
查看>>
unsigned int 转 RGB
查看>>
ViewPage实现幻灯广告墙
查看>>
Tapestry ErrorReport
查看>>
print语句中逗号(,)和反斜杠(\)的区别
查看>>
contentType
查看>>
垃圾回收算法
查看>>
模拟退火 Buried memory
查看>>
java文件课后动手动脑
查看>>
EL表达式的语法与应用
查看>>
如何大幅提升web前端性能之看tengine在大公司架构实践
查看>>
Mybatis常见问题
查看>>
set
查看>>
PHP常用技术文之文件操作和目录操作总结
查看>>
laraval框架model注意事项
查看>>
十大著名的思想实验(程序员应该会读喜欢这些)
查看>>
C# 输出24小时格式时间
查看>>
ajax属性详解
查看>>
eclipse 快捷键.
查看>>