Python中with語句的理解

2021-08-19 18:23:48 字數 3075 閱讀 8743

with expr [ as

var ]:

block

簡單說明:

1,expr可以是任意表示式。

2,as

var是可選的。

3,block是with語句的語句體

1,計算expr,並獲取乙個上下文管理器。

2,上下文管理器的exit()方法被儲存起來用於之後的呼叫。

3,呼叫上下文管理器的enter()方法

4,如果with表示式包含as var,那麼expr的返回值被賦值給var。

5,執行block中的表示式

6,調永上下文管理器的exit()方法。如果block的執行過程中發生了乙個異常導致程式退出,那麼異常中的type、value、和traceback(也就是sys.exc_info()的返回值)將作為引數傳遞給exit()方法,然後異常丟擲在控制台。否則將傳遞三個none值。

mgr = (expr)

exit = type(mgr).__exit__ # 這裡沒有執行

value = type(mgr).__enter__(mgr)

exc = true

try:

try:

var = value # 如果有 as

varblock

except:

exc = false

ifnot

exit(mgr, *sys.exc_info()):

raise

finally:

if exc:

exit(mgr, none, none, none)

1,如果上下文管理器中沒有enter()或者exit()中的任意乙個方法,那麼直譯器會丟擲乙個attributeerror.

2,在block中發生異常後,如果exit()方法返回乙個可以被看成是true的值,那麼這個異常就不會被丟擲,後面的**會繼續執行。

class

my_name:

def__enter__

(self):

print("呼叫__enter__()方法")

return

"xiaoke"

def__exit__

(self, type, value, trace):

print("呼叫__exit__()方法")

defget_name

():return my_name()

with get_name() as name:

print("my name is :", name)

# 結果如下:

# 呼叫__enter__()方法

# my name is : xiaoke

# 呼叫__exit__()方法

class

number:

# with語句執行的時候呼叫

def__enter__

(self):

print("呼叫_enter_()方法")

return self

# with語句執行完畢,結束的時候呼叫

def__exit__

(self, type, value, trace):

print("type:", type)

print("value:", value)

print("trace:", trace)

# 當有異常的時候,那麼就不會有返回值

defdo_number

(self):

num = 10 / 0

return num + 100

with number()as result:

res = result.do_number()

print(res)

# 結果如下:

# 呼叫_enter_()方法

# type:

# value: division by zero

# trace:

# traceback (most recent call last):

# file "e:/pycharmproject/test49.py", line 56, in

# res = result.do_number()

# file "e:/pycharmproject/test49.py", line 51, in do_number

# num = 10 / 0

# zerodivisionerror: division by zero

官網**:

import asyncio

async def

coro

(name, lock):

print('coro {}: waiting for lock'.format(name))

async with lock:

print('coro {}: holding the lock'.format(name))

await asyncio.sleep(1)

print('coro {}: releasing the lock'.format(name))

loop = asyncio.get_event_loop()

lock = asyncio.lock()

coros = asyncio.gather(coro(1, lock), coro(2, lock))

try:

loop.run_until_complete(coros)

finally:

loop.close()

coro 1: waiting for

lock

coro 1: holding the lock

coro 2: waiting for

lock

coro 1: releasing the lock

coro 2: holding the lock

coro 2: releasing the lock

對於Python中RawString的理解

1 作用 可以表示 多行注釋 多行字串 其內的單雙引號不轉義 2 r 代表的意思是 raw 3 r 只對其內的反斜槓起作用 注意單個 的問題 raw string 有什麼用處呢?raw string 就是會自動將反斜槓轉義。print n print r n n 注 出現了兩個空行是因為 print...

對於Python中RawString的理解

1 作用 可以表示 多行注釋 多行字串 其內的單雙引號不轉義 2 r 代表的意思是 raw 3 r 只對其內的反斜槓起作用 注意單個 的問題 raw string 有什麼用處呢?raw string 就是會自動將反斜槓轉義。print n print r n n 注 出現了兩個空行是因為 print...

對python中property函式的理解

對python中property函式的理解 class status object def init self,created at none,id none,text none,user none,now none self.created at created at self.id id sel...