with和python上下文管理器

2021-10-02 06:03:28 字數 1541 閱讀 8862

下面是3種開啟資源的方式,一種直接開啟,一種try方式,一種with方式,每個的方式的優缺點就不說了,這裡記錄下with先骨幹的內容。

f = open("a.txt","r+")

# do thing

f.close()

try:

f = open("a.txt", "r+")

# do thing

except ioerror as e:

print e

finally:

f.close()

with open("a.txt", "r+") as f:

pass

以往知道的是with幫使用者執行了finnally的操作,但是其實沒那麼簡單。with是一種叫做python上下文管理器的方式。

稱之為context,如果熟悉其他語言的,可能對這個比較熟悉,context就是上下文,安卓裡面比較多,可以理解上下文環境。

python的上下文管理器,更多的是一種python**優雅方式,方便我們在某乙個環境下執行我們自己的**,這個環境就是上下文管理,比如我們要開啟檔案操作,那在操作過程中,我希望的是檔案一直處於開啟的狀態或者說環境,然後執行完畢後,退出這個環境,這是python的上下文管理器。

我們也可以自己寫自己的上下文管理器,這樣方便我們進行一些操作,特別是對於一些資源可以考慮用上下文管理器。

with context_expr [as var]:

with_body

其中context_expr就是上下文管理器,我們自己怎麼寫上下文管理器呢?

只要物件支援__enter__,__exit__,這兩個方法,就被稱為上下文管理器,比如下面的方式。

class mycontext(object):

def __init__(self):

pass

def __enter__(self):

print "enter"

return open("a.txt","r+")

def __exit__(self, exc_type, exc_val, exc_tb):

print exc_tb, exc_type, exc_val

with在使用上下文管理器的時候是怎麼做的呢,先去執行enter方法,然後在最後推出時,執行exit方法。

enter的返回值會賦值給對應的變數,然後在with裡面進行相關操作

with mycontext() as a:

for i in a.readlines():

print i

除了這個之外,python提供上下文管理器的裝飾器來讓我們方便使用,contextlib

import contextlib

@contextlib.contextmanager

def freadopen(file):

f = open(file,"rb")

yield f

f.close()

程序上下文和中斷上下文

程序上下文和中斷上下文是作業系統中很重要的兩個概念,這兩個概念在作業系統課程中不斷被提及,是最經常接觸 看上去很懂但又說不清楚到底怎麼回事。造成這種局面的原因,可能是原來接觸到的作業系統課程的教學總停留在一種淺層次的理論層面上,沒有深入去研究。處理器總處於以下狀態中的一種 核心態,執行於程序上下文,...

程序上下文和中斷上下文

程序上下文是一種核心所處的操作模式,此時核心代表程序執行 例如執行系統呼叫或執行核心執行緒。上下文context 上下文簡單說來就是乙個環境,相對於程序而言,就是程序執行時的環境。具體來說就是各個變數和資料,包括所有的暫存器變數 程序開啟的檔案 記憶體資訊等。乙個程序的上下文可以分為三個部分 使用者...

程序上下文和中斷上下文

核心空間和使用者空間是現代作業系統的兩種工作模式,核心模組執行在核心空間,而使用者態應用程式執行在使用者空間。它們代表不同的級別,而對系統資源具有不同的訪問許可權。核心模組執行在最高端別 核心態 這個級下所有的操作都受系統信任,而應用程式執行在較低級別 使用者態 在這個級別,處理器控制著對硬體的直接...