生活随笔
收集整理的這篇文章主要介紹了
TensorFlow(六)with语句
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
with語句
with 語句:
要使用 with 語句,首先要明白上下文管理器這一概念,有了上下文管理器,with 語句才能工作。
什么是上下文管理器:
這個管理器就是在對象內實現了兩個方法:enter () 和exit ()
enter ()方法會在with的代碼塊執行之前執行,exit ()會在代碼塊執行結束后執行。
exit ()方法內會自帶當前對象的清理方法。 下面是一組與上下文管理器和with 語句有關的概念:
上下文管理協議(Context Management Protocol):包含方法 enter () 和exit (),支持該協議的對象要實現這兩個方法。 上下文管理器(Context Manager):支持上下文管理協議的對象,這種對象實現了enter () 和 exit () 方法。上下文管理器定義執行 with 語句時要建立的運行時上下文,負責執行 with 語句塊上下文中的進入與退出操作。通常使用 with語句調用上下文管理器,也可以通過直接調用其方法來使用。 運行時上下文(runtimecontext):由上下文管理器創建,通過上下文管理器的 enter () 和exit () 方法實現,enter ()方法在語句體執行之前進入運行時上下文,exit () 在語句體執行完后從運行時上下文退出。with 語句支持運行時上下文這一概念。 上下文表達式(Context Expression):with 語句中跟在關鍵字 with之后的表達式,該表達式要返回一個上下文管理器對象。 語句體(with-body):with語句包裹起來的代碼塊,在執行語句體之前會調用上下文管理器的 enter () 方法,執行完語句體之后會執行exit () 方法。
作用:適用于對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用后自動關閉、線程中鎖的自動獲取和釋放等。 工作條件:使用with語句調用上下文管理器(Context Manager) 基本語法:
使用with語句語法格式: 這里 context_expression 要返回一個上下文管理器對象,該對象并不賦值給 as 子句中的 target(s) ,如果指定了 as 子句的話,會將上下文管理器的 enter () 方法的返回值賦值給 target(s)。target(s) 可以是單個變量,或者由“()”括起來的元組(不能是僅僅由“,”分隔的變量列表,必須加“()”)。 with context_expression[as target(s)] with-body
使用 with 語句操作文件對象 這里使用了 with 語句,不管在處理文件過程中是否發生異常,都能保證 with 語句執行完畢后已經關閉了打開的文件句柄。
for line in somefile:print line
Python的with語句是提供一個有效的機制,讓代碼更簡練,同時在異常產生時,清理工作更簡單。
with語句執行過程
執行 context_expression,生成上下文管理器 context_manager 調用上下文管理器的 enter () 方法;如果使用了 as 子句,則將 enter () 方法的返回值賦值給 as 子句中的 target(s) 執行語句體 with-body 不管是否執行過程中是否發生了異常,執行上下文管理器的 exit () 方法,exit () 方法負責執行“清理”工作,如釋放資源等。如果執行過程中沒有出現異常,或者語句體中執行了語句 break/continue/return,則以 None 作為參數調用 exit (None, None, None) ;如果執行過程中出現異常,則使用 sys.exc_info 得到的異常信息為參數調用 exit (exc_type, exc_value, exc_traceback) 出現異常時,如果 exit (type, value, traceback) 返回 False,則會重新拋出異常,讓with 之外的語句邏輯來處理異常,這也是通用做法;如果返回 True,則忽略異常,不再對異常進行處理
with語句如何工作
with語句執行的解析: with context_expr() as var: doSomething()
當with語句執行時,便執行上下文表達式(context_expr)(一般為某個方法)來獲得一個上下文管理器對象,上下文管理器的職責是提供一個上下文對象,用于在with語句塊中處理細節: 一旦獲得了上下文對象,就會調用它的enter ()方法,將完成with語句塊執行前的所有準備工作,如果with語句后面跟了as語句,則用enter ()方法的返回值來賦值; 當with語句塊結束時,無論是正常結束,還是由于異常,都會調用上下文對象的exit ()方法,exit ()方法有3個參數,如果with語句正常結束,三個參數全部都是 None;如果發生異常,三個參數的值分別等于調用sys.exc_info()函數返回的三個值:類型(異常類)、值(異常實例)和跟蹤記錄(traceback),相應的跟蹤記錄對象。 因為上下文管理器主要作用于共享資源,enter ()和exit ()方法基本是完成的是分配和釋放資源的低層次工作,比如:數據庫連接、鎖分配、信號量加/減、狀態管理、文件打開/關閉、異常處理等。
class A(object): def enter (self): print(‘enter () called’) return self
def print_hello(self):print("hello world!")def __exit__(self, e_t, e_v, t_b):print('__exit__() called')
首先會執行enter 方法 with A() as a: # a為enter 的返回對象 a.print_hello() print(‘got instance’) 結束會執行exit 方法
輸出結果:
enter () called hello world! got instance exit () called
總結
以上是生活随笔 為你收集整理的TensorFlow(六)with语句 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。