最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python with 上下文管理器

 更新時間:2020年09月02日 11:41:55   作者:Yanbin  
這篇文章主要介紹了python with和上下文管理器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下

作為一個 Java 為母語的程序員來講,學(xué)習(xí)起其他新的語言就難免任何事都與 Java 進行橫向?qū)Ρ?。Java 7 引入了能省去許多重復(fù)代碼的 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) {
}

它相應(yīng)的不使用 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 關(guān)鍵字,它的概念叫做上下文管理器(Context Manager)。

with 關(guān)鍵字的使用

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

以上的代碼相當(dāng)于

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

也就是 with 關(guān)鍵字打開的資源會在 with 語句塊結(jié)束后自動調(diào)用相應(yīng)的方法自動釋放(無論 with 中操作是否有異常)。

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

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

public void close() throws IOException

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

而在 Python 中,能被 with 的類有兩種實現(xiàn)方式

實現(xiàn)基本方法以支持上下文管理器的類

一個 Python 類要能被用于 with 上下文,必須實現(xiàn)至少 __enter__ __exit__ 方法。這兩個方法的意思好理解,一個是創(chuàng)建資源后,后者是退出 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())

假設(shè) data.txt 文件中的內(nèi)容是

hello
world

那么以上程序執(zhí)行后的輸出就是

--enter
hello
world
---exit

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

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

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

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

使用 f 的執(zhí)行代碼將被放置在 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 位置將產(chǎn)生異常,會造成 f.close() 得不到執(zhí)行,不能正確釋放該資源。

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

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

@contextmanager 裝飾器內(nèi)部也是封裝為一個實現(xiàn)了 __enter__ __exit__ 方法的對象。

參考鏈接:Context Managers

以上就是詳解python with 上下文管理器的詳細內(nèi)容,更多關(guān)于python with 上下文管理器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python?pyecharts數(shù)據(jù)可視化實例詳解

    Python?pyecharts數(shù)據(jù)可視化實例詳解

    PyEcharts是一個用于生成?Echarts圖表的類庫,?Python是一門富有表達力的語言,很適合用于數(shù)據(jù)處理,下面這篇文章主要給大家介紹了關(guān)于Python?pyecharts數(shù)據(jù)可視化的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Python實現(xiàn)蒙特卡洛模擬的示例代碼

    Python實現(xiàn)蒙特卡洛模擬的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)蒙特卡洛模擬,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Python使用numpy模塊創(chuàng)建數(shù)組操作示例

    Python使用numpy模塊創(chuàng)建數(shù)組操作示例

    這篇文章主要介紹了Python使用numpy模塊創(chuàng)建數(shù)組操作,結(jié)合實例形式分析了Python使用numpy模塊實現(xiàn)數(shù)組的創(chuàng)建、賦值、修改、打印等相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-06-06
  • python2.7和NLTK安裝詳細教程

    python2.7和NLTK安裝詳細教程

    這篇文章主要為大家詳細介紹了python2.7和NLTK安裝詳細教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 基于Python實現(xiàn)自動化文檔整理工具

    基于Python實現(xiàn)自動化文檔整理工具

    一個人可能會在計算機上存儲大量的照片、視頻和文檔文件,這些文件可能散落在不同的文件夾中,難以管理和查找。所以本文就來用Python制作一個自動化文檔整理工具吧
    2023-04-04
  • Python類的定義、繼承及類對象使用方法簡明教程

    Python類的定義、繼承及類對象使用方法簡明教程

    這篇文章主要介紹了Python類的定義、繼承及類對象使用方法簡明教程,本文用淺顯易懂的語言講解了類的定義、繼承及類對象的使用,非常實用易懂,需要的朋友可以參考下
    2015-05-05
  • pytorch實現(xiàn)邏輯回歸

    pytorch實現(xiàn)邏輯回歸

    這篇文章主要為大家詳細介紹了pytorch實現(xiàn)邏輯回歸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • python迭代器常見用法實例分析

    python迭代器常見用法實例分析

    這篇文章主要介紹了python迭代器常見用法,結(jié)合實例形式分析了Python迭代器概念、功能、常見操作方法及相關(guān)注意事項,需要的朋友可以參考下
    2019-11-11
  • Python中Iterator迭代器的使用雜談

    Python中Iterator迭代器的使用雜談

    Python中的迭代器意義不僅是在iter函數(shù)上的運用,更是一種處理可迭代對象的迭代器模式,這里我們來簡單聊聊Python中Iterator迭代器的使用雜談:
    2016-06-06
  • 使用BeautifulSoup4解析XML的方法小結(jié)

    使用BeautifulSoup4解析XML的方法小結(jié)

    這篇文章主要介紹了使用BeautifulSoup4解析XML的方法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論

云霄县| 荥阳市| 奉节县| 乐东| 五家渠市| 巴彦县| 保康县| 凌云县| 南开区| 安庆市| 博野县| 崇礼县| 日土县| 河西区| 瑞金市| 兰溪市| 铁岭县| 横山县| 资中县| 光山县| 扶余县| 阿拉善右旗| 冷水江市| 信宜市| 闵行区| 从化市| 新昌县| 汉寿县| 弥渡县| 大庆市| 禹城市| 潼南县| 汉寿县| 鱼台县| 琼结县| 金湖县| 澎湖县| 玉屏| 朝阳县| 丘北县| 吉木乃县|