91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中上下文管理器的示例分析

發布時間:2021-07-16 14:03:04 來源:億速云 閱讀:157 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Python中上下文管理器的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Python上下文管理器

簡介

最近用到這個,仔細了解了一下,感覺是十分有用的,記錄一下

使用場景

當我們需要獲取一個臨時打開的資源,并在使用完畢后進行資源釋放和異常處理,利用try-catch語句可以完成,舉個例子。

打開文件:

f = None
try:
 print("try")
 f = open("__init__.py", "r")
 print(f.read())
except Exception as e:
 print("exception")
finally:
 if f:
  print("finally")
  f.close()

利用上下文管理器:

class OpenHandle:

 def __init__(self, filename, mode):
  self.filename = filename
  self.mode = mode

 def __enter__(self):
  self.f = open(self.filename, self.mode)
  return self.f

 def __exit__(self, exc_type, exc_val, exc_tb):
  if exc_type:
   print("exception")
  else:
   print("normal")
  self.f.close()

with OpenHandle("book.txt", "r") as f:
 print(f.read())

這樣可以利用with-as語句改寫代碼,讓程序員關注業務主流程,去掉對于資源的獲取和關閉這些重復操作。提升代碼的可讀性。好處很大。

執行順序

執行順序是理解這種寫法的關鍵:

  • 初始化,執行handle的__init__()

  • __enter__()方法,獲取資源對象,返回給as后的變量

  • 業務代碼邏輯

  • __exit__方法,傳入3個參數,異常類型,異常對象,調用棧對象,無異常都為None

  • 拋出異常或者正常結束

函數式上下文管理器

利用from contextlib import contextmanager這個裝飾器可以將函數裝飾為上下文管理器,其實這個裝飾背后也是返回一個實現了__enter__和__exit__方法的類

from contextlib import contextmanager

@contextmanager
def managed_resource(*args, **kwds):
 # Code to acquire resource, e.g.:
 resource = acquire_resource(*args, **kwds)
 try:
  yield resource
 finally:
  # Code to release resource, e.g.:
  release_resource(resource)

>>> with managed_resource(timeout=3600) as resource:
...  # Resource is released at the end of this block,
...  # even if code in the block raises an exception

模板代碼

sqlalchemy會話上下文管理器

利用這個管理sqlalchemy會話對象的獲取和釋放,控制事務是再合適不過了

class DbTransaction:

 def __init__(self, session_maker):
  self.session_maker = session_maker

 def __enter__(self):
  self.session = self.session_maker()
  return self.session

 def __exit__(self, exc_type, exc_val, exc_tb):
  if exc_type:
   self.session.rollback()
  else:
   self.session.commit()
  self.session.close()
  return False if exc_type else True

關于“Python中上下文管理器的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会昌县| 湘潭县| 泗水县| 崇州市| 新源县| 永丰县| 安西县| 佳木斯市| 乡城县| 榆社县| 永定县| 咸阳市| 安国市| 镶黄旗| 永修县| 禹州市| 滨州市| 新干县| 蒙城县| 罗源县| 南汇区| 天镇县| 于田县| 吴堡县| 开阳县| 万年县| 桃园市| 米易县| 焉耆| 平昌县| 荥阳市| 山西省| 壤塘县| 乌兰浩特市| 平江县| 达拉特旗| 江津市| 洛浦县| 巴彦淖尔市| 长沙市| 广河县|