程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python with上下文管理

編輯:Python

with語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用後自動關閉/線程中鎖的自動獲取和釋放等。

with 工作原理

  • 緊跟with後面的語句被求值後,返回對象的__enter__()方法被調用,這個方法的返回值將被賦值給as後面的變量。

  • 當with後面的代碼塊全部被執行完之後,將調用前面返回對象的__exit__()方法。

例如:

class SqlHelper(object):
def __enter__(self):
return 123
def __exit__(self, exc_type, exc_val, exc_tb):
print("in __exit__")
# 創建Sqlhelper對象
sqlhelper = SqlHelper()
with sqlhelper as f:
print(f)

運行上面代碼輸出:

123
in __exit__

說明with會首先執行 SqlHelper類裡面的__enter__()方法,並將__enter__()方法的返回值賦值給f,因此打印出f就是__enter__()的返回值。

當執行完後,會執行__exit__()方法。

__exit__()方法中有3個參數, exc_type, exc_val, exc_tb,這些參數在異常處理中相當有用。

  • exc_type: 錯誤的類型
  • exc_val: 錯誤類型對應的值
  • exc_tb: 代碼中錯誤發生的位置

例如:

class Sample():
def __enter__(self):
print('in enter')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print "type: ", exc_type
print "val: ", exc_val
print "tb: ", exc_tb
def do_something(self):
bar = 1 / 0
return bar + 10
with Sample() as sample:
sample.do_something()

運行程序輸出:

in enter
Traceback (most recent call last):
type: <type 'exceptions.ZeroDivisionError'>
val: integer division or modulo by zero
File "/home/user/cltdevelop/Code/TF_Practice_2017_06_06/with_test.py", line 36, in <module>
tb: <traceback object at 0x7f9e13fc6050>
sample.do_something()
File "/home/user/cltdevelop/Code/TF_Practice_2017_06_06/with_test.py", line 32, in do_something
bar = 1 / 0
ZeroDivisionError: integer division or modulo by zero
Process finished with exit code 1

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved