python with 語句研究

2021-06-07 01:15:37 字數 2083 閱讀 2421

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().it is __enter__ returned"

print "t is 1,yes,it is ".format(t)

#raise nameerror("hi here")

#sys.exit()

print "never here"

在使用鎖機制時, 經常會用到with 語句

import threading

_lock = threading.lock()

with _lock:

...

如果有乙個類包含  __enter__ 方法和 __exit__ 方法,像這樣:

class  controlled_execution:

def__enter__(self):

set things up

return thing

def__exit__(self, type, value, traceback):

tear things down

那麼它就可以和with一起使用,像這樣:

with controlled_execution() as thing:

some code

當with語句被執行的時候,python對表示式進行求值,對求值的結果(叫做「內容守護者」)呼叫__enter__方法,並把__enter__

方法的返回值賦給as後面的變數。然後python會執行接下來的程式碼段,並且無論這段程式碼幹了什麼,都會執行「內容守護者」的__exit__

方法。

作為額外的紅利,__exit__方法還能夠在有exception的時候看到exception,並且壓制它或者對它做出必要的反應。要壓制exception,只需要返回乙個true。比如,下面的__exit__方法吞掉了任何的typeerror,但是讓所有其他的exceptions通過:

def __exit__(self, type, value, traceback):

return isinstance(value, typeerror)在python2.5中,file object擁有__enter__和__exit__方法,前者僅僅是返回object自己,而後者則關閉這個檔案:

>>> f = open("x.txt")

>>> f

>>> f.__enter__()

>>> f.read(1)

'x' >>> f.__exit__(none, none, none)

>>> f.read(1)

traceback (most recent call last):

file "", line 1, in valueerror: i/o operation on closed file

這樣要開啟乙個檔案,處理它的內容,並且保證關閉它,你就可以簡簡單單地這樣做:

with open("x.txt") as f:

data = f.read()

do something with data我的補充:

資料庫的連線好像也可以和with一起使用,我在一本書上看到以下內容:

conn = sqlite.connect("somedb")

with conn:

conn.execute("insert into sometable values (?,?)",("foo","bar"))

在這個例子中,commit()是在所有with資料塊中的語句執行完畢並且沒有錯誤之後自動執行的,如果出現任何的異常,將執行rollback()

操作,再次提示異常。

Python with語句定義及使用

方法 1 首先介紹下with 工作原理 緊跟with後面的語句被求值後,返回物件的 enter 方法被呼叫,這個方法的返回值將被賦值給as後面的變數 當with後面的 塊全部被執行完之後,將呼叫前面返回物件的 exit 方法。with工作原理 示例 class sample def enter se...

Python with語句和過程抽取思想

python中的with語句使用於對資源進行訪問的場合,保證不管處理過程中是否發生錯誤或者異常都會執行規定的 exit 清理 操作,釋放被訪問的資源,比如有檔案讀寫後自動關閉 執行緒中鎖的自動獲取和釋放等。與python中with語句有關的概念有 上下文管理協議 上下文管理器 執行時上下文 上下文表...

python with用法詳解

coding utf8 def except try try print start raise keyerror raise indexerror return 1 except keyerror print key error 異常時執行 return 2 else print other er...