五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

Python編程ContextManager上下文管理器講解

發(fā)布日期:2021-12-30 07:59 | 文章來源:源碼中國

什么是上下文管理器

官方解釋

上下文管理器是一個(gè)對象它定義了在執(zhí)行 with 語句時(shí)要建立的運(yùn)行時(shí)上下文上下文管理器處理進(jìn)入和退出所需的運(yùn)行時(shí)上下文以執(zhí)行代碼塊上下文管理器通常使用 with 語句調(diào)用,但也可以通過直接調(diào)用它們的實(shí)例方法來使用

一頓花里胡哨猛如虎,結(jié)果我也不太懂

簡單一句話

同時(shí)包含 __enter__() 和 __exit__() 方法的對象就是上下文管理器

__enter__(self)

進(jìn)入上下文管理器自動調(diào)用的方法

該方法會在 with ... as ... 代碼塊執(zhí)行之前執(zhí)行

如果 with 語句有 as 子句,且該方法有返回值,那么該方法的返回值會被賦值給 as 子句后的變量,最常見的with open('file_path', 'w') as file:

該方法可以返回多個(gè)值,因此在 as 子句后面也可以指定多個(gè)變量(多個(gè)變量必須由“()”括起來組成元組)

__exit__(self, exc_type, exc_value, exc_traceback)

退出上下文管理器自動調(diào)用的方法,會返回一個(gè)布爾類型的值

該方法會在with ... as ...代碼塊執(zhí)行之后執(zhí)行

如果with ... as ...代碼塊成功執(zhí)行結(jié)束,程序自動調(diào)用該方法,且三個(gè)參數(shù)都為 None

如果 with ... as ... 代碼塊執(zhí)行時(shí)發(fā)生異常,通過sys.exc_info()得到異常信息,三個(gè)參數(shù)值分別是:異常類型、異常信息、異?;厮菪畔㈩愋?/p>

有哪些常見上下文管理器?

打開文件

with open('file_path', 'w') as file:
 file.write('hello world !')

拆分了解

上下文表達(dá)式:with open('file_path', 'w') as file:

上下文管理器:open('file_path', 'w')

file:可以理解為資源對象

執(zhí)行順序

先執(zhí)行 open() 的 __enter__() 方法,將返回值賦值給 file

執(zhí)行file.write('hello world !')

最后執(zhí)行 open() 的 __exit__() 方法

自定義上下文管理器

其實(shí)有兩種方式

基于類實(shí)現(xiàn)上下文管理器

只需要給對象添加一個(gè)__enter__和一個(gè)__exit__方法

import sys
class Resource:
 def __init__(self, name):
  self.name = name
  print("== 初始化方法 ==")
 
 def __enter__(self):
  print(f"** 進(jìn)入上下文管理器自動調(diào)用:name is {self.name}")
  # 可以返回任意類型的值
  return {"name": self.name}
 
 def __exit__(self, exc_type, exc_val, exc_tb):
  print(f"## 退出上下文管理器自動調(diào)用:", sys.exc_info(), exc_type, exc_val, exc_tb)
  if exc_tb is None:
print("沒有異常時(shí)關(guān)閉資源")
  else:
print("遇到異常時(shí)關(guān)閉資源")

通過 with 來調(diào)用該上下文管理器

也稱為:使用 with ... as ... 管理資源

with Resource("小菠蘿") as r:
 print(r)

console 輸出結(jié)果

== 初始化方法 ==
** 進(jìn)入上下文管理器自動調(diào)用:name is 小菠蘿
{'name': '小菠蘿'}
## 退出上下文管理器自動調(diào)用: (None, None, None) None None None
沒有異常時(shí)關(guān)閉資源

__exit__() 方法的三個(gè)參數(shù)值都是 None

with 代碼塊拋出異常

with Resource("異常小菠蘿") as r:
 print('[with代碼塊] 異常之前的代碼')
 raise Exception("拋出了 Exception")
 print('[with代碼塊] ~~~~~~~~異常之后的代碼')

console 輸出結(jié)果

== 初始化方法 ==
** 進(jìn)入上下文管理器自動調(diào)用:name is 異常小菠蘿
[with代碼塊] 異常之前的代碼
## 退出上下文管理器自動調(diào)用: (<class 'Exception'>, Exception('拋出了 Exception'), <traceback object at 0x10e203200>) <class 'Exception'> 拋出了 Exception <traceback object at 0x10e203200>
遇到異常時(shí)關(guān)閉資源
Traceback (most recent call last):
File "/Users/polo/Documents/pylearn/第七章:文件相關(guān)/1_上下文管理器.py", line 36, in <module>
raise Exception("拋出了 Exception")
Exception: 拋出了 Exception

代碼塊拋出異常的時(shí)候,可以看到 __exit__() 方法的三個(gè)參數(shù)值的確來源于sys.exc_info()

總結(jié)

  • 無論 with 代碼塊是否有異常,最終都會自動調(diào)用 __exit__() 方法
  • 當(dāng)拋出異常時(shí),__exit__() 默認(rèn)返回 None,會重新拋出異常到外面,讓 with ... as ... 以外的代碼來處理異常
  • 反之,如果返回 True,就會忽略異常,不再對異常進(jìn)行處理

__exit__() 返回 True

 def __exit__(self, exc_type, exc_val, exc_tb):
  print(f"## 退出上下文管理器自動調(diào)用:", sys.exc_info(), exc_type, exc_val, exc_tb)
  if exc_tb is None:
print("沒有異常時(shí)關(guān)閉資源")
  else:
print("遇到異常時(shí)關(guān)閉資源")
return True
 
 
# 再次運(yùn)行
with Resource("異常小菠蘿") as r:
 print('[with代碼塊] 拋出異常之前的代碼')
 raise Exception
 print('[with代碼塊] 拋出異常之后的代碼')

console 輸出結(jié)果

== 初始化方法 ==
** 進(jìn)入上下文管理器自動調(diào)用:name is 異常小菠蘿
[with代碼塊] 異常之前的代碼
## 退出上下文管理器自動調(diào)用: (<class 'Exception'>, Exception('拋出了 Exception'), <traceback object at 0x100e29200>) <class 'Exception'> 拋出了 Exception <traceback object at 0x100e29200>
遇到異常時(shí)關(guān)閉資源

不再拋出異常

基于生成器實(shí)現(xiàn)上下文管理器

通過裝飾器contextlib.contextmanager,來定義自己所需的基于生成器的上下文管理器

from contextlib import contextmanager 
@contextmanager
def file_manager(name, mode):
 try:
  # 1、打開文件
  file = open(name, mode)
  # 2、返回文件資源對象
  yield file
 finally:
  # 3、關(guān)閉文件
  file.close() 
with file_manager('a.txt', 'w') as file:
 print(file)
 file.write('hello world')

函數(shù) file_manager() 就是一個(gè)生成器

當(dāng)執(zhí)行 with as 語句時(shí),獲取文件資源對象,生成器暫停執(zhí)行,返回文件資源對象并賦值給 file

當(dāng) with 語句執(zhí)行完后,生成器繼續(xù)執(zhí)行剩余代碼,關(guān)閉文件,釋放資源

總結(jié)

  • 基于生成器的上下文管理器時(shí),不再用定義 __enter__() 和 __exit__() 方法
  • 但需要加上裝飾器 @contextmanager

with 語句的教程

https://www.jb51.net/article/172132.htm

以上就是Python編程ContextManager上下文管理器講解的詳細(xì)內(nèi)容,更多關(guān)于Python編程Context Manager的資料請關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部