with和python上下文管理器

整理一下with相關的內容,以及python上下文管理器

下面是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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章