簡單談談contextlib的使用

2022-05-27 11:39:10 字數 1741 閱讀 5797

你肯定用過with open的方法開啟檔案,然後進行讀取寫入等操作是吧:

with open('/tmp/a.txt', a) as file_obj:

file_obj.write("hello carson")

contextlib就是實現這種功能的黑魔法。先說上面的檔案操作流程:

開啟檔案,給file_obj

處理鴨,讀啊,寫啊,啥的

關閉開啟的檔案file_obj,即使中間出了錯誤啊啥的,exception啥的,也能關閉的那種。

contextlib實現呢,就是:

from contextlib import contextmanager

@contextmanager

def make_open_context(filename, mode):

fp = open(filename, mode)

try:

yield fp

finally:

fp.close()

with make_open_context('/tmp/a.txt', 'a') as file_obj:

file_obj.write("hello carson666")

看到這個yield,如果你不懂的話,看鏈結吧:yield方法解釋。如果不懂yield,後面的沒法說了。

簡單來說:把yield看作return,但是肯定是有區別的:

如果你呼叫這個函式with make_open_context('/tmp/a.txt', 'a') as file_obj:,那麼會讓函式執行到yield fp也就是return fp,欸,就返回了是吧,返回的fpfile_obj了。

然後就是跑處理的內容,即:file_obj.write("hello carson666"),好,處理部分跑完了。

然後就會繼續剛才的函式中的**:finally: fp.close()

也就是說,yield所對應的行會把函式分為兩部分,第一部分在with make_open_context('/tmp/a.txt', 'a') as file_obj:中執行,然後返回的值給as的物件file_obj;接著執行處理的內容;完事了再執行後面的第二部分。

好了,直到這個流程了,我們可以做什麼呢,做前面和後面是一樣的,但是中間是不一樣的事務,這樣的任務。

你是不是懵了,沒關係,看下面這個例子:

from contextlib import contextmanager

@contextmanager

def book_mark():

print('《', end="")

yield

print('》', end="")

with book_mark():

# 核心**

print('且將生活一飲而盡', end="")

輸出:《且將生活一飲而盡》

我的csdn:

我的:我的github:

紙上得來終覺淺,絕知此事要躬行~

by 李英俊小朋友

Python中的contextlib模組

我之前在這篇部落格裡說到了如何定義乙個上下文管理器協議 with語句 今天要說乙個更簡單的定義方式。python提供了乙個內建的模組contextlib,該模組有乙個裝飾器 contextlib.contextmanager,可以將函式變為上下文管理器。import contextlib conte...

簡單談談 merge

var arr1 1,2,3 var arr2 1,2,3 console.log merge arr1,arr2 1,2,3,1,2,3 可見陣列間只是合併,不會發生相同元素覆蓋 var arr1 1,2,3 var obj2 console.log merge arr1,obj2 返回的是陣列,...

簡單談談測試流程

各位好,今天給大家介紹一下這個測試流程,這個問題在面試的時候還是經常會被問到的乙個問題,我結合一下我們公司的流程,跟大家聊一聊,到底測試需要什麼樣子的流程。說的不全面的地方還請各位不吝賜教 1.需求評審 需求評審主要是我們產品,開發,測試一起參加的,主要是針對產品的需求進行分析,產品經理會針對這專案...