欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python上下文管理器全實(shí)例詳解

 更新時(shí)間:2019年11月12日 16:53:23   作者:happy_code  
在本篇文章里小編給大家整理的是關(guān)于Python上下文管理器全實(shí)例解析的知識點(diǎn),需要的朋友們參考下。

Python上下文管理器

簡介

最近用到這個(gè),仔細(xì)了解了一下,感覺是十分有用的,記錄一下

使用場景

當(dāng)我們需要獲取一個(gè)臨時(shí)打開的資源,并在使用完畢后進(jìn)行資源釋放和異常處理,利用try-catch語句可以完成,舉個(gè)例子。

打開文件:

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語句改寫代碼,讓程序員關(guān)注業(yè)務(wù)主流程,去掉對于資源的獲取和關(guān)閉這些重復(fù)操作。提升代碼的可讀性。好處很大。

執(zhí)行順序

執(zhí)行順序是理解這種寫法的關(guān)鍵:

  • 初始化,執(zhí)行handle的__init__()
  • __enter__()方法,獲取資源對象,返回給as后的變量
  • 業(yè)務(wù)代碼邏輯
  • __exit__方法,傳入3個(gè)參數(shù),異常類型,異常對象,調(diào)用棧對象,無異常都為None
  • 拋出異常或者正常結(jié)束

函數(shù)式上下文管理器

利用from contextlib import contextmanager這個(gè)裝飾器可以將函數(shù)裝飾為上下文管理器,其實(shí)這個(gè)裝飾背后也是返回一個(gè)實(shí)現(xiàn)了__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會(huì)話上下文管理器

利用這個(gè)管理sqlalchemy會(huì)話對象的獲取和釋放,控制事務(wù)是再合適不過了

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

以上就是全部相關(guān)知識點(diǎn),感謝大家的學(xué)習(xí)和對腳本之家的支持。

相關(guān)文章

  • python實(shí)現(xiàn)自動(dòng)下載sftp文件

    python實(shí)現(xiàn)自動(dòng)下載sftp文件

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)下載sftp文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Python本地搭建靜態(tài)Web服務(wù)器的實(shí)現(xiàn)

    Python本地搭建靜態(tài)Web服務(wù)器的實(shí)現(xiàn)

    本文主要介紹了Python本地搭建靜態(tài)Web服務(wù)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 一百多行python代碼實(shí)現(xiàn)搶票助手

    一百多行python代碼實(shí)現(xiàn)搶票助手

    一百多行python代碼輕松實(shí)現(xiàn)搶票助手,十一出行不再愁!本文具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python 爬蟲 批量獲取代理ip的實(shí)例代碼

    python 爬蟲 批量獲取代理ip的實(shí)例代碼

    今天小編就為大家分享一篇python 爬蟲 批量獲取代理ip的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python 遍歷磁盤目錄的三種方法

    python 遍歷磁盤目錄的三種方法

    這篇文章主要介紹了python 遍歷磁盤目錄的三種方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • Python中的迭代器你了解嗎

    Python中的迭代器你了解嗎

    迭代器是一種特殊的對象,它實(shí)現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個(gè)訪問元素,本文就來帶大家深入了解一下Python中迭代器的使用,需要的可以參考下
    2023-05-05
  • Python讀寫unicode文件的方法

    Python讀寫unicode文件的方法

    這篇文章主要介紹了Python讀寫unicode文件的方法,涉及Python針對文件的讀取及編碼操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • django配置app中的靜態(tài)文件步驟

    django配置app中的靜態(tài)文件步驟

    這篇文章主要介紹了django配置app中的靜態(tài)文件步驟,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python查看包版本、更新單個(gè)包、卸載單個(gè)包的操作方法

    python查看包版本、更新單個(gè)包、卸載單個(gè)包的操作方法

    這篇文章主要介紹了python查看包版本、更新單個(gè)包、卸載單個(gè)包,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • python中subprocess批量執(zhí)行l(wèi)inux命令

    python中subprocess批量執(zhí)行l(wèi)inux命令

    本篇文章給大家詳細(xì)講述了python中使用subprocess批量執(zhí)行l(wèi)inux命令的方法,有興趣的朋友參考學(xué)習(xí)下。
    2018-04-04

最新評論