方法(1):
首先介紹下with 工作原理
(1)緊跟with後面的語句被求值後,返回物件的「enter()」方法被呼叫,這個方法的返回值將被賦值給as後面的變數;
(2)當with後面的**塊全部被執行完之後,將呼叫前面返回物件的「exit()」方法。
with工作原理**示例:
class sample:
def __enter__(self):
print "in __enter__"
return "foo"
def __exit__(self, exc_type, exc_val, exc_tb):
print "in __exit__"
def get_sample():
return sample()
with get_sample() as sample:
print "sample: ", sample12
3456
78910
**的執行結果如下:
in __enter__
sample: foo
in __exit__12
3
可以看到,整個執行過程如下:
(1)enter()方法被執行;
(2)enter()方法的返回值,在這個例子中是」foo」,賦值給變數sample;
(3)執行**塊,列印sample變數的值為」foo」;
(4)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()12
3456
78910
1112
13
程式輸出結果:
in enter
traceback (most recent call last):
type: val: integer division or modulo by zero
file "/home/user/cltdevelop/code/tf_practice_2017_06_06/with_test.py", line 36, in tb: 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 112
3456
78910
1112
方法(2):
實現乙個新的上下文管理器的最簡單的方法就是使用 contexlib 模組中的 @contextmanager 裝飾器。 下面是乙個實現了**塊計時功能的上下文管理器例子:
import time
from contextlib import contextmanager
@contextmanager
def timethis(label):
start = time.time()
try:
yield
finally:
end = time.time()
print('{}: {}'.format(label, end - start))12
3456
78910
11
with timethis('counting'):
n = 10000000
while n > 0:
n -= 112
345
在函式 timethis() 中,yield 之前的**會在上下文管理器中作為enter() 方法執行, 所有在 yield 之後的**會作為exit() 方法執行。 如果出現了異常,異常會在yield語句那裡丟擲。 python with 語句研究
import sys class test def enter self print enter return 1 def exit self,args print exit return true with test as t print t is not the result of test i...
Python with語句和過程抽取思想
python中的with語句使用於對資源進行訪問的場合,保證不管處理過程中是否發生錯誤或者異常都會執行規定的 exit 清理 操作,釋放被訪問的資源,比如有檔案讀寫後自動關閉 執行緒中鎖的自動獲取和釋放等。與python中with語句有關的概念有 上下文管理協議 上下文管理器 執行時上下文 上下文表...
關於python with的用法及異常處理
在網上看到一些人部落格使用 with 用於異常處理,但是我在網仔細查閱,發現 該關鍵字不是用於處理異常的。實際上,在with後面的 塊丟擲異常時,exit 方法被執行。開發庫時,清理資源,關閉檔案等操作,都可以放在exit 方法中。總之,with as表示式極大的簡化了每次寫finally的工作,這...