Python with語句定義及使用

2021-09-29 05:53:26 字數 2609 閱讀 1226

方法(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的工作,這...