Python 中 with用法及原理

2021-09-24 18:19:55 字數 2721 閱讀 5025

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

如下**:

file = open("/users/zhangsf/data/other.txt")

data = file.read()

print(data)

file.close()

try:

f = open("/users/zhangsf/data/other.txt")

data = f.read()

print(data)

except:

print('fail to open')

exit(-1)

finally:

print("finally")

f.close()

雖然這段**執行良好,但比較冗長。 

而使用with的話,能夠減少冗長,還能自動處理上下文環境產生的異常。如下面**:

with open("/users/zhangsf/data/other.txt") as file:

data = file.read()

print(data)

(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: ", sample

**的執行結果如下:

in __enter__

sample: foo

in __exit__

可以看到,整個執行過程如下: 

(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()

程式輸出結果:

traceback (most recent call last):

file "/users/zhangsf/code/python/python_learn/bash/test_with.py", line 57, in sample.do_something()

in enter

file "/users/zhangsf/code/python/python_learn/bash/test_with.py", line 54, in do_something

type: bar = 1 / 0

val: division by zero

zerodivisionerror: division by zero

tb: process finished with exit code 1

實際上,在with後面的**塊丟擲異常時,exit()方法被執行。開發庫時,清理資源,關閉檔案等操作,都可以放在exit()方法中。 

總之,with-as表示式極大的簡化了每次寫finally的工作,這對**的優雅性是有極大幫助的。 

如果有多項,可以這樣寫:

with open('1.txt') as f1, open('2.txt') as  f2:

do something

python中decorator的用法及原理(一)

什麼叫裝飾器,其實也可以叫做包裝器。即對於乙個既有的函式func args 在呼叫它之前和之後,我們希望都做一些事情,把這個函式包裝起來。python中的裝飾器分為兩類 函式裝飾器和類裝飾器。這裡我們先討論函式裝飾器。def decorator1 func def dec args print pr...

Python 中return用法及意義

其實說白了,函式就是個你招來的工人。你給他一些材料,告訴他怎麼用這些材料拼裝,然後他負責把拼裝好的成品交給你。材料就是函式的引數,成品是函式的輸出,而怎麼拼裝就是你寫的函式體 了。比如這段 def worker a,b,c x a b y x c這個工人worker在你的指導下,用a b c三個材料...

python中random函式及用法

1 python中的random函式 random 方法返回隨機生成的乙個實數,它在 0,1 範圍內 import random random.random randint函式,返回指定範圍的乙個隨機整數,包含上下限 random.randint 0,99 返回0 99之間的整數 randrange...