欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python with用法:自動(dòng)關(guān)閉文件進(jìn)程

 更新時(shí)間:2019年07月10日 09:57:13   投稿:yaominghui  
這篇文章主要介紹了Python with用法:自動(dòng)關(guān)閉文件進(jìn)程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

實(shí)際上,Python 提供了 with 語句來管理資源關(guān)閉。比如可以把打開的文件放在 with 語句中,這樣 with 語句就會(huì)幫我們自動(dòng)關(guān)閉文件。

with 語句的語法格式如下:

with context expression [as target(s)]:
  with 代碼塊

在上面的語法格式中,context_expression 用于創(chuàng)建可自動(dòng)關(guān)閉的資源。

例如,程序使用 with 語句來讀取文件:

import codecs
# 使用with語句打開文件,該語句會(huì)負(fù)責(zé)關(guān)閉文件
with codecs.open("readlines_test.py", 'r', 'utf-8', buffering=True) as f:
  for line in f:
    print(line, end='')

程序也可以使用 with 語句來處理通過 fileinput.input 合并的多個(gè)文件,例如如下程序:

import fileinput
# 使用with語句打開文件,該語句會(huì)負(fù)責(zé)關(guān)閉文件
with fileinput.input(files=('test.txt', 'info.txt')) as f:
  for line in f:
    print(line, end='')

上面兩個(gè)程序都使用了 with 語句來管理資源,因此它們都不需要顯式關(guān)閉文件。

那么,with 語句的實(shí)現(xiàn)原理是什么?其實(shí)很簡(jiǎn)單,使用 with 語句管理的資源必須是一個(gè)實(shí)現(xiàn)上下文管理協(xié)議(context manage protocol)的類,這個(gè)類的對(duì)象可被稱為上下文管理器。要實(shí)現(xiàn)上下文管理協(xié)議,必須實(shí)現(xiàn)如下兩個(gè)方法:

  • context_manager.__enter__():進(jìn)入上下文管理器自動(dòng)調(diào)用的方法。該方法會(huì)在 with 代碼塊執(zhí)行之前執(zhí)行。如果 with 語句有 as子句,那么該方法的返回值會(huì)被賦值給 as 子句后的變量;該方法可以返回多個(gè)值,因此,在 as 子句后面也可以指定多個(gè)變量(多個(gè)變量必須由“()”括起來組成元組)。
  • context_manager.__exit__(exc_type, exc_value, exc_traceback):退出上下文管理器自動(dòng)調(diào)用的方法。該方法會(huì)在 with 代碼塊執(zhí)行之后執(zhí)行。如果 with 代碼塊成功執(zhí)行結(jié)束,程序自動(dòng)調(diào)用該方法,調(diào)用該方法的三個(gè)參數(shù)都為 None:如果 with 代碼塊因?yàn)楫惓6兄?,程序也自?dòng)調(diào)用該方法,使用 sys.exc_info 得到的異常信息將作為調(diào)用該方法的參數(shù)。

通過上面的介紹不難發(fā)現(xiàn),只要一個(gè)類實(shí)現(xiàn)了 __enter__() 和 __exit__(exc_type, exc_value, exc_traceback) 方法,程序就可以使用 with 語句來管理它;通過 __exit__() 方法的參數(shù),即可判斷出 with 代碼塊執(zhí)行時(shí)是否遇到了異常。

換而言之,上面程序所用的文件對(duì)象、FileInput 對(duì)象,其實(shí)都實(shí)現(xiàn)了這兩個(gè)方法,因此它們都可以接受 with 語句的管理。

下面我們自定義一個(gè)實(shí)現(xiàn)上下文管理協(xié)議的類,并使用 with 語句來管理它:

class FkResource:
  def __init__(self, tag):
    self.tag = tag
    print('構(gòu)造器,初始化資源: %s' % tag)
  # 定義__enter__方法,with體之前的執(zhí)行的方法
  def __enter__(self):
    print('[__enter__ %s]: ' % self.tag)
    # 該返回值將作為as子句中變量的值
    return 'fkit' # 可以返回任意類型的值
  # 定義__exit__方法,with體之后的執(zhí)行的方法
  def __exit__(self, exc_type, exc_value, exc_traceback):
    print('[__exit__ %s]: ' % self.tag)
    # exc_traceback為None,代表沒有異常
    if exc_traceback is None:
      print('沒有異常時(shí)關(guān)閉資源')
    else:
      print('遇到異常時(shí)關(guān)閉資源')
      return False  # 可以省略,默認(rèn)返回None也被看做是False
with FkResource('孫悟空') as dr:
  print(dr)
  print('[with代碼塊] 沒有異常')
print('------------------------------')
with FkResource('白骨精'):
  print('[with代碼塊] 異常之前的代碼')
  raise Exception
  print('[with代碼塊] ~~~~~~~~異常之后的代碼')

上面程序定義了一個(gè) FkResource 類,該類定義了 __enter__() 和 __exit__() 兩個(gè)方法,因此該類的對(duì)象可以被 with 語句管理:

  • 程序在執(zhí)行 with 代碼塊之前,會(huì)執(zhí)行 __enter__() 方法,并將該方法的返回值賦值給 as 子句后的變量。
  • 程序在執(zhí)行 with 代碼塊之后,會(huì)執(zhí)行 __exit__() 方法,可以根據(jù)該方法的參數(shù)來判斷 with 代碼塊是否有異常。

程序兩次使用 with 語句管理 FkResource 對(duì)象。第一次,with 代碼塊沒有出現(xiàn)異常。第二次,with 代碼塊出現(xiàn)了異常。大家可以看到,使用 with 語句兩次對(duì) FkResource 的管理略有差異(主要是在 __exit()__ 方法中略有差異)。

運(yùn)行上面的程序,可以看到如下輸出結(jié)果:

構(gòu)造器,初始化資源: 孫悟空
[__enter__ 孫悟空]:
fkit
[with代碼塊] 沒有異常
[__exit__ 孫悟空]:
沒有異常時(shí)關(guān)閉資源
------------------------------
構(gòu)造器,初始化資源: 白骨精
[__enter__ 白骨精]:
[with代碼塊] 異常之前的代碼
[__exit__ 白骨精]:
遇到異常時(shí)關(guān)閉資源
Traceback (most recent call last):
 File "C:\Users\mengma\Desktop\1.py", line 26, in <module>
  raise Exception
Exception

從上面的輸出結(jié)果來看,使用 with 語句管理資源,程序總可以在進(jìn)入 with 代碼塊之前自動(dòng)執(zhí)行 __enter__() 方法,無論 with 代碼塊是否有異常,這個(gè)部分都是一樣的,而且 __enter__() 方法的返回值被賦值給了 as 子句后的變量,如上面的 ① 號(hào)輸出信息所示。

對(duì)于 with 代碼塊有異常和無異常這兩種情況,此時(shí)主要通過 exit() 方法的參數(shù)進(jìn)行判斷,程序可針對(duì) with 代碼塊是否有異常分別進(jìn)行處理,如程序中代碼所示。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 5個(gè)Python殺手級(jí)的自動(dòng)化腳本分享

    5個(gè)Python殺手級(jí)的自動(dòng)化腳本分享

    Python是一種功能強(qiáng)大的語言,廣泛用于自動(dòng)執(zhí)行各種任務(wù),只要想通過自動(dòng)化日常任務(wù)來節(jié)省時(shí)間的人,Python?都能滿足您的需求。本文整理了5個(gè)Python腳本,希望對(duì)大家有所幫助
    2023-01-01
  • Pygame實(shí)戰(zhàn)練習(xí)之推箱子游戲

    Pygame實(shí)戰(zhàn)練習(xí)之推箱子游戲

    推箱子想必是很多人童年時(shí)期的經(jīng)典游戲,我們依舊能記得抱個(gè)老人機(jī)娛樂的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于如何利用python寫一個(gè)簡(jiǎn)單的推箱子小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Python中sys模塊常用方法與變量實(shí)例探究

    Python中sys模塊常用方法與變量實(shí)例探究

    sys?模塊是 Python 標(biāo)準(zhǔn)庫中的一個(gè)核心模塊,提供了與解釋器進(jìn)行交互的功能,了解?sys?模塊的方法和變量對(duì)于更有效地管理和調(diào)試 Python 程序至關(guān)重要,本文將深入探討?sys?模塊的常用方法和變量,通過詳細(xì)的示例代碼,幫助大家更全面地了解并靈活運(yùn)用這一關(guān)鍵模塊
    2024-01-01
  • 解決已經(jīng)安裝requests,卻依然提示No module named requests問題

    解決已經(jīng)安裝requests,卻依然提示No module named requests問題

    今天小編就為大家分享一篇解決已經(jīng)安裝requests,卻依然提示No module named 'requests'問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • numpy中的norm()函數(shù)求范數(shù)實(shí)例

    numpy中的norm()函數(shù)求范數(shù)實(shí)例

    這篇文章主要介紹了numpy中的norm()函數(shù)求范數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python標(biāo)準(zhǔn)庫shutil用法實(shí)例詳解

    Python標(biāo)準(zhǔn)庫shutil用法實(shí)例詳解

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫shutil用法,結(jié)合實(shí)例形式分析了shutil庫針對(duì)文件與文件夾各種常見操作技巧與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • Python實(shí)現(xiàn)二分法算法實(shí)例

    Python實(shí)現(xiàn)二分法算法實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)二分法算法實(shí)例,本文先是介紹了算法規(guī)則,然后給出了實(shí)現(xiàn)例子,需要的朋友可以參考下
    2015-02-02
  • Python selenium 加載并保存QQ群成員,去除其群主、管理員信息的示例代碼

    Python selenium 加載并保存QQ群成員,去除其群主、管理員信息的示例代碼

    這篇文章主要介紹了Python selenium 加載并保存QQ群成員 去除其群主、管理員信息的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-05-05
  • python3爬蟲中引用Queue的實(shí)例講解

    python3爬蟲中引用Queue的實(shí)例講解

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于python3爬蟲中引用Queue的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • 詳談python http長(zhǎng)連接客戶端

    詳談python http長(zhǎng)連接客戶端

    下面小編就為大家?guī)硪黄斦刾ython http長(zhǎng)連接客戶端。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評(píng)論