你肯定用過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
,欸,就返回了是吧,返回的fp
給file_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.需求評審 需求評審主要是我們產品,開發,測試一起參加的,主要是針對產品的需求進行分析,產品經理會針對這專案...