欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python with用法:自動關閉文件進程

系統 1615 0

實際上,Python 提供了 with 語句來管理資源關閉。比如可以把打開的文件放在 with 語句中,這樣 with 語句就會幫我們自動關閉文件。

with 語句的語法格式如下:

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

在上面的語法格式中,context_expression 用于創建可自動關閉的資源。

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

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

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

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

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

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

  • context_manager.__enter__():進入上下文管理器自動調用的方法。該方法會在 with 代碼塊執行之前執行。如果 with 語句有 as子句,那么該方法的返回值會被賦值給 as 子句后的變量;該方法可以返回多個值,因此,在 as 子句后面也可以指定多個變量(多個變量必須由“()”括起來組成元組)。
  • context_manager.__exit__(exc_type, exc_value, exc_traceback):退出上下文管理器自動調用的方法。該方法會在 with 代碼塊執行之后執行。如果 with 代碼塊成功執行結束,程序自動調用該方法,調用該方法的三個參數都為 None:如果 with 代碼塊因為異常而中止,程序也自動調用該方法,使用 sys.exc_info 得到的異常信息將作為調用該方法的參數。

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

換而言之,上面程序所用的文件對象、FileInput 對象,其實都實現了這兩個方法,因此它們都可以接受 with 語句的管理。

下面我們自定義一個實現上下文管理協議的類,并使用 with 語句來管理它:

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

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

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

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

運行上面的程序,可以看到如下輸出結果:

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: av日韩在线看 | 久久久久久久一区二区 | 一级做a爰片久久毛片看看 欧美日韩精品国产一区二区 | 日韩在线视频免费 | 国产成人精品午夜 | 麻豆av免费观看 | 欧美成人一区二区三区在线视频 | 噜噜噜动态图超猛烈 | 91大神精品长腿在线观看网站 | 久久精品在线 | 久久天天拍天天爱天天躁 | 午夜欧美一区二区三区在线播放 | 中文字幕不卡在线观看 | 99人体做爰视频 | 奇米四色在线观看 | 久久亚洲精品玖玖玖玖 | 色狠狠成人综合网 | 久久国内精品 | 欧美偷拍自拍视频 | 天天艹夜夜艹 | 久操久热 | 久草中文在线观看 | 看个毛片 | 亚洲第一视频 | 日本不良网站 | 激情五月综合婷婷 | 久久精品99 | 精品一区二区久久久久久久网站 | 国产精品国产 | 免费99热在线观看 | 欧美色欧美亚洲高清在线视频 | 亚洲一区二区三区视频 | 欧美精品在线视频观看 | 91视频导航| 亚洲日本中文字幕永久 | 欧洲精品久久久 | 久久久精 | 久久伊人色综合 | 特级全黄 | 亚洲毛片在线观看 | 99青青草|