在Python開(kāi)發(fā)中,我們經(jīng)常會(huì)使用到with語(yǔ)法塊,例如在讀寫(xiě)文件時(shí),保證文件描述符的正確關(guān)閉,避免資源泄露問(wèn)題。
你有沒(méi)有思考過(guò),with背后是如何實(shí)現(xiàn)的?我們常常聽(tīng)到的上下文管理器究竟是什么?
這篇文章我們就來(lái)學(xué)習(xí)一下Python上下文管理器,以及with的運(yùn)行原理。
with語(yǔ)法塊
在講解with語(yǔ)法之前,我們先來(lái)看一下不使用with的代碼如何寫(xiě)?
我們?cè)诓僮饕粋€(gè)文件時(shí),代碼可以這么寫(xiě):
#打開(kāi)文件f=open('file.txt')forlineinf:#讀取文件內(nèi)容執(zhí)行其他操作#do_something...#關(guān)閉文件f.close()
這個(gè)例子非常簡(jiǎn)單,就是打開(kāi)一個(gè)文件,然后讀取文件中的內(nèi)容,最后關(guān)閉文件釋放資源。
但是,代碼這么寫(xiě)會(huì)有一個(gè)問(wèn)題:在打開(kāi)文件后,如果要對(duì)讀取到的內(nèi)容進(jìn)行其他操作,在這操作期間發(fā)生了異常,這就會(huì)導(dǎo)致文件句柄無(wú)法被釋放,進(jìn)而導(dǎo)致資源的泄露。
如何解決這個(gè)問(wèn)題?
也很簡(jiǎn)單,我們使用try...finally來(lái)優(yōu)化代碼:
#打開(kāi)文件f=open('file.txt')try:forlineinf:#讀取文件內(nèi)容執(zhí)行其他操作#do_something...finally:#保證關(guān)閉文件f.close()
這么寫(xiě)的好處是,在讀取文件內(nèi)容和操作期間,無(wú)論是否發(fā)生異常,都可以保證最后能釋放文件資源。
但這么優(yōu)化,代碼結(jié)構(gòu)會(huì)變得很繁瑣,每次都要給代碼邏輯增加try...finally才可以,可讀性變得很差。
針對(duì)這種情況,我們就可以使用with語(yǔ)法塊來(lái)解決這個(gè)問(wèn)題:
withopen('file.txt')asf:forlineinf:#do_something...
使用with語(yǔ)法塊可以完成之前相同的功能,而且這么寫(xiě)的好處是,代碼結(jié)構(gòu)變得非常清晰,可讀性也很好
以上內(nèi)容為大家介紹了python的with語(yǔ)法塊,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.parentadvocate.org/