整理一下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()