日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解python with 上下文管理器

瀏覽:45日期:2022-07-12 14:42:06

作為一個 Java 為母語的程序員來講,學習起其他新的語言就難免任何事都與 Java 進行橫向對比。Java 7 引入了能省去許多重復代碼的 try-with-resources 特性,不用每回 try/finally 來釋放資源(不便之處有局部變量必須聲明在 try 之前,finally 里還要嵌套 try/catch 來處理異常)。比如下面的 Java 代碼

try(InputStream inputStream = new FileInputStream('abc.txt')) { System.out.println(inputStream.read());} catch (Exception ex) {}

它相應的不使用 try-with-resources 語法的代碼就是

InputStream inputStream = null;try { inputStream = new FileInputStream('abc.txt');} catch (Exception ex) {} finally { if(inputStream != null) { try { inputStream.close(); } catch (Exception ex) { } }}

類似的 Python 也有自己的 try-with-resources 寫法,就是 with 關鍵字,它的概念叫做上下文管理器(Context Manager)。

with 關鍵字的使用

with open(’some_file’, ’w’) as opened_file: opened_file.write(’Hola!’)

以上的代碼相當于

opened_file = open(’some_file’, ’w’)try: opened_file.write(’Hola!’)finally: opened_file.close()

也就是 with 關鍵字打開的資源會在 with 語句塊結束后自動調用相應的方法自動釋放(無論 with 中操作是否有異常)。

with 用起來是很方便的,但是什么樣的資源可以用 with 關鍵字?Python 是怎么知道要調用哪個方法來關閉資源的?進而如何實現自己的支持上下文管理器的 Python 類。

再次回顧 Java 的 try-with-resources 語法,try(...) 括號支持的類必須是實現了 AutoCloseable 接口,它的接口方法是

public void close() throws IOException

也就是 Java 的 try-with-resources 語法會自動調用以上方法來釋放資源,要實現可被自動釋放的 Java 就只須遵照這一規則就行。

而在 Python 中,能被 with 的類有兩種實現方式

實現基本方法以支持上下文管理器的類

一個 Python 類要能被用于 with 上下文,必須實現至少 __enter__ 和 __exit__ 方法。這兩個方法的意思好理解,一個是創建資源后,后者是退出 with 語句塊后。請看下面的例子

class File(object): def __init__(self, file_name, method): self.file_obj = open(file_name, method) def __enter__(self): print('---enter') return self.file_obj def __exit__(self, type, value, traceback): print('---exit') self.file_obj.close() with File(’data.txt’, ’r’) as data_file: print(data_file.read())

假設 data.txt 文件中的內容是

helloworld

那么以上程序執行后的輸出就是

--enterhelloworld---exit

__enter__ 返回的值作為 with ... as data_file 中的 data_file 變量的值,如果 __enter__ 沒有返回,data_file 得到的就是 NoneType object 了。 __exit__ 可利用來釋放資源 沒有 __enter__ 方法試圖用 with 的寫法執行時會得到 AttributeErro: __enter__ 異常 同樣,沒有 __exit__ 方法試圖用 with 的寫法執行時會得到 AttributeErro: __exit__ 異常 __exit__ 有其他額外的三個參數,可獲得資源的值,以及能處理 with 塊中執行出現異常的情況 __exit__ 的返回值也有用途,如果它返回 True 則出現的異常不再向外傳播,其他值的話直接向外拋

利用生成器(Generator) 和裝飾器創建支持上下文管理器的方法

此種方式比較簡單,不過邏輯控制上沒有這么強。

from contextlib import contextmanager @contextmanagerdef open_file(name, method): f = open(name, method) yield f f.close()

使用 f 的執行代碼將被放置在 yield f 所處的位置,with 使用以上方法。yield 后的 f 變量將是 with...as 后的變量值

with open_file(’some_file’, ’w’) as file_object: file_object.write(’hola!’)

這里也要注意異常處理的情況,比如把上面代碼打開文件的模式換作 r, 仍然試圖去寫文件,這樣在 open_file 方法的 yield f 位置將產生異常,會造成 f.close() 得不到執行,不能正確釋放該資源。

欲更具防御性,前面的 yield f 可以擴展也如下的形式

try: yield fexcept Exception as ex: pass #處理異常,或繼續向外拋finally: f.close()

@contextmanager 裝飾器內部也是封裝為一個實現了 __enter__ 和 __exit__ 方法的對象。

參考鏈接:Context Managers

以上就是詳解python with 上下文管理器的詳細內容,更多關于python with 上下文管理器的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜视频精品| 精品久久97| 青青草伊人久久| 蜜臀精品一区二区三区在线观看 | 91国内精品| 日本va欧美va精品发布| 777久久精品| 国产中文字幕一区二区三区| 国产精品一国产精品k频道56| 国产精品一区二区av日韩在线| 国产精品久久久久久久久久齐齐| 精品视频在线你懂得| 中文字幕在线视频网站| 激情综合网站| 日本一区二区三区视频在线看| 国产精品videossex久久发布 | 亚洲欧美日韩一区在线观看| 中文字幕亚洲在线观看| 国产日产精品一区二区三区四区的观看方式 | 国产精品大片免费观看| 欧美成人a交片免费看| 91超碰国产精品| 青青伊人久久| 日本欧美不卡| 久久国产免费看| 成人羞羞视频播放网站| 亚洲精品第一| 欧美gv在线| 日韩av三区| 久久久久久色| 日韩精品诱惑一区?区三区| 午夜久久福利| 麻豆视频一区| 欧美日韩亚洲三区| 日韩深夜视频| 欧美精品福利| 国产一级久久| 精品视频99| 日韩高清一区在线 | 亚洲18在线| 久久久久中文| 高清一区二区| 国产精品7m凸凹视频分类| 麻豆视频久久| 国产精品中文字幕制服诱惑| 国产一区成人| 欧美1级日本1级| 国产在线观看www| 欧美日韩1区| 亚洲精品少妇| 日韩久久电影| 影院欧美亚洲| 岛国精品一区| 欧美精品成人| 成人在线视频中文字幕| 国产精品久久久久av蜜臀| 日本视频中文字幕一区二区三区| 合欧美一区二区三区| 欧美日韩水蜜桃| 午夜日本精品| 男人天堂欧美日韩| 久久夜色精品| 亚洲ww精品| 国产午夜精品一区在线观看| 亚洲精品极品| 国产精品久久久久久久久久妞妞 | 影院欧美亚洲| 亚洲欧美日韩高清在线| 黄色日韩在线| 综合激情五月婷婷| 日本va欧美va欧美va精品| 欧美日一区二区在线观看| 久久一区国产| 精品一区免费| 91精品日本| 麻豆理论在线观看| 日韩视频精品在线观看| 午夜电影一区| 国产精选一区| 日韩精品网站| 亚洲+小说+欧美+激情+另类| 欧美黑人做爰爽爽爽| 日本va欧美va精品| 免费不卡在线观看| 麻豆成人综合网| 99久精品视频在线观看视频| 福利一区二区三区视频在线观看| 国产一区二区三区黄网站| 精品一级视频| 欧美在线亚洲| 国产日产一区| 欧美日韩激情| 福利一区二区三区视频在线观看| 激情欧美丁香| 91精品国产自产精品男人的天堂 | 欧美搞黄网站| 午夜国产精品视频| 国产精品欧美一区二区三区不卡| 日韩一区二区三区高清在线观看| 91久久午夜| 国产欧美一级| 神马午夜在线视频| 91综合网人人| 欧美一区二区三区久久精品| 午夜国产一区二区| 日韩高清欧美| 精精国产xxxx视频在线野外| 久久午夜精品一区二区| 日韩不卡一二三区| 国产+成+人+亚洲欧洲在线| 激情五月色综合国产精品| 亚洲精品美女91| 亚洲日产av中文字幕| 欧美三区四区| 欧美三区不卡| 精品国产亚洲一区二区三区大结局 | 精品一区二区三区视频在线播放| 亚洲午夜黄色| 中文字幕乱码亚洲无线精品一区| 久久亚洲道色| 国产欧美另类| 亚洲精品网址| 亚洲一级少妇| 国产精品一区二区精品| 日本成人精品| 欧美日韩一区自拍| 久久成人av| 国产伦理一区| 国产aa精品| 国产高清不卡| 亚洲激情国产| 亚洲精品影视| 麻豆久久久久久久| 日韩在线二区| 午夜精品亚洲| 日本国产欧美| 捆绑调教美女网站视频一区| 成人一区而且| 999在线观看精品免费不卡网站| 天堂成人免费av电影一区 | 久久久亚洲一区| 久久xxxx精品视频| 国产伦一区二区三区| 日本综合字幕| 综合干狼人综合首页| 国产伦精品一区二区三区在线播放| 美女精品一区二区| 色综合www| 综合色一区二区| 欧美xxxx中国| 中文无码久久精品| 成人在线超碰| 亚洲精品亚洲人成在线观看| caoporn视频在线| 蜜桃av一区二区在线观看| 精品三区视频| 日韩欧美美女在线观看| 成人午夜精品| 国产精品成人国产| 玖玖精品视频| 日本欧美不卡| 久久精品国产网站| 视频一区日韩| 亚洲成人精品| 国产一区二区三区四区大秀| 石原莉奈在线亚洲二区| 中文字幕成在线观看| 国产美女视频一区二区| 国产一区白浆| 日韩欧美一区二区三区免费观看| 国产精品一区高清| 亚洲最大av| 日韩专区欧美专区| 激情综合激情| 久久久久午夜电影| 三上悠亚国产精品一区二区三区 | 精品久久不卡| 国产福利一区二区精品秒拍| 亚洲一二av| 蜜臀久久99精品久久久久久9 | 国产亚洲一区| 日韩久久99| 日韩中文av| 中文字幕一区二区三区四区久久 | 国产精品chinese| 国产精品亚洲欧美日韩一区在线| 亚洲免费成人av在线| 亚洲天堂日韩在线| 日韩中文字幕一区二区三区| 99久久夜色精品国产亚洲1000部| 精品久久91| 色综合www| 国产精品美女久久久| 激情综合自拍| 日韩精品一二三四| 日韩国产欧美在线播放| 久久99精品久久久野外观看| 91亚洲一区| 国产偷自视频区视频一区二区| 影音先锋久久精品|