博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
contextlib
阅读量:6260 次
发布时间:2019-06-22

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

contextlib   

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

编写__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这个decorator接受一个generator

在某段代码执行前后自动执行特定代码,也可以用@contextmanager实现。例如:

@contextmanager

def tag(name):
print("<%s>" % name)
yield
print("</%s>" % name)

with tag("h1"):

print("hello")
print("world")

上述代码执行结果为:

<h1>

hello
world
</h1>

with语句首先执行yield之前的语句,因此打印出<h1>;

yield调用会执行with语句内部的所有语句,因此打印出hello和world;
最后执行yield之后的语句,打印出</h1>。

可以用closing()来把该对象变为上下文对象。例如,用with语句使用urlopen():

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

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

转载于:https://www.cnblogs.com/wander-clouds/p/8503729.html

你可能感兴趣的文章
netty源码分析之pipeline(二)
查看>>
面试:讲讲 Android 的事件分发机制
查看>>
计算机程序的思维逻辑 (95) - Java 8的日期和时间API
查看>>
计算机程序的思维逻辑 (8) - char的真正含义
查看>>
2019 年技术大趋势预测
查看>>
推荐一款基于vue的滚动条插件vuescroll
查看>>
安全圈有多大?也许就这么大!
查看>>
App基于手机壳颜色换肤?先尝试一下用 KMeans 来提取图像中的主色
查看>>
RecyclerView的滚动事件研究
查看>>
XXL-MQ v1.2.2 发布,分布式消息队列
查看>>
多线程:GCD
查看>>
深度解读 2018 JavaScript 趋势报告(含视频)
查看>>
以 RAIDs 分析作为架构驱动力
查看>>
Rust 2018 年度调查报告
查看>>
Tensorflow快餐教程(1) - 30行代码搞定手写识别
查看>>
聊聊flink Table的Set Operations
查看>>
3.3 卷积神经网络进阶-Inception-mobile_net
查看>>
JS学习系列 06 - 变量对象
查看>>
Swift开发应用时如何更方便地使用颜色?
查看>>
ubuntu虚拟机设置静态ip(windows能够ping通ubuntu虚拟机)
查看>>