python內(nèi)置模塊之上下文管理contextlib
Python中當(dāng)我們們打開文本時(shí),通常會是用with語句,with語句允許我們非常方便的使用資源,而不必?fù)?dān)心資源沒有關(guān)閉。
with open('/path/filename', 'r') as f:
f.read()然而,并不是只有open()函數(shù)返回fp對象才能使用 with 語句。實(shí)際上,任何對象,只要正確實(shí)現(xiàn)上下文管理,就可以使用with語句。
實(shí)現(xiàn)上下文管理是通過 __enter__ 和 __exit__ 這兩個(gè)方法實(shí)現(xiàn)的。例如,下面的class實(shí)現(xiàn)了這兩個(gè)方法:
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的標(biāo)準(zhǔn)庫 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 這個(gè)裝飾器接受一個(gè) generator,用 yield 語句把 with ... as var 把變量輸出去,然后,with 語句就可以正常的工作了:
with create_query('Bob') as q:
q.query()很多時(shí)候,我們希望在某段代碼執(zhí)行前后自動執(zhí)行特定代碼,也可以用 @contextmanager實(shí)現(xiàn)。
@contextmanager
def tag(name):
print("<%s>" % name)
yield
print("" % name)
with tag("h1"):
print("hello")
print("world")上述代碼執(zhí)行結(jié)果:
hello
world
</h1>
代碼的執(zhí)行順序是:
- with 語句 首先執(zhí)行 yield 之前的語句,因此打印出.
- yield 調(diào)用會執(zhí)行 with 語句內(nèi)部的所有語句,因此打印出 hello 和 world.
- 最后執(zhí)行yield之后的語句,打印出結(jié)果
二、@closing
如果一個(gè)對象沒有實(shí)現(xiàn)上下文,就不能使用 with 語句,但是可以用 closing() 來把對象變?yōu)樯舷挛膶ο蟆?/p>
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 也是一個(gè)經(jīng)過 @contextmanager 裝飾的generator
@contextmanager
def closing(thing):
try:
yield thing
finally:
thing.close()它的作用就是把任意對象變?yōu)樯舷挛膶ο?,并支?with語句。
到此這篇關(guān)于python內(nèi)置模塊之上下文管理contextlib的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python中順序結(jié)構(gòu)和循環(huán)結(jié)構(gòu)示例代碼
這篇文章主要介紹了Python中的條件語句和循環(huán)語句,條件語句用于根據(jù)條件執(zhí)行不同的代碼塊,循環(huán)語句用于重復(fù)執(zhí)行一段代碼,文章還詳細(xì)說明了range函數(shù)的使用和continue與break語句的作用,需要的朋友可以參考下2025-02-02
教你使用Python的pygame模塊實(shí)現(xiàn)拼圖游戲
pygame模塊是一個(gè)可以跨平臺的模塊,其設(shè)計(jì)目的就是為電子游戲而設(shè)計(jì),能夠支持圖片和聲音,下面這篇文章主要給給大家介紹了關(guān)于使用Python的pygame模塊實(shí)現(xiàn)拼圖游戲的相關(guān)資料,需要的朋友可以參考下2022-07-07
Python實(shí)現(xiàn)隨機(jī)生成圖片驗(yàn)證碼詳解
這篇文章主要介紹了如何利用Python生成隨機(jī)的圖片驗(yàn)證碼 并打印驗(yàn)證碼的值,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起試試2022-01-01
python項(xiàng)目127.0.0.1:5000訪問失敗問題解決
Windows環(huán)境下啟動python項(xiàng)目,接口訪問失敗,本文給大家分享python項(xiàng)目127.0.0.1:5000訪問失敗問題解決方法,感興趣的朋友跟隨小編一起看看吧2023-09-09
python實(shí)現(xiàn)在圖片上畫特定大小角度矩形框
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)在圖片上畫特定大小角度矩形框,以及C++的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
使用opencv中匹配點(diǎn)對的坐標(biāo)提取方式
這篇文章主要介紹了使用opencv中匹配點(diǎn)對的坐標(biāo)提取方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
python使用PIL縮放網(wǎng)絡(luò)圖片并保存的方法
這篇文章主要介紹了python使用PIL縮放網(wǎng)絡(luò)圖片并保存的方法,涉及Python操作網(wǎng)絡(luò)圖片的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04

