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...