日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python的上下文管理

發布時間:2025/7/25 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python的上下文管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  說道上下文管理首先想到的就是這個:

class MyResource:def __enter__(self):print("查詢開始")return selfdef __exit__(self, exc_type, exc_val, exc_tb):print("查詢結束")def query(self):print("查詢中")with MyResource() as f:f.query()

  執行結果

查詢開始 查詢中 查詢結束

  但是我們這里要說的不是這個,

from contextlib import contextmanagerclass MyResource:def query(self):print("查詢中")@contextmanager def make_myresource():print("查詢開始")yield MyResource()print("查詢結束")# 這里的f是yield后面返回的實例 with make_myresource() as f:f.query()

  python給了我們一個contextmanager,contextmanager最大的好處就是可以將不是上下文處理器的類變成一個類似上下文處理的方式來解決問題。

  上面的運行結果依然是:

查詢開始 查詢中 查詢結束

  簡單的例子,我想把我一本圖書的名字加上書名號輸出:

from contextlib import contextmanager@contextmanager def make_myresource():print("", end='')yieldprint("")# 這里的f是yield后面返回的實例 with make_myresource():print("my world", end='') 《my world》

  下面看一個例子:

try:# 此時已經支持事務,commit之前都沒有真正提交gift = Gift()gift.isbn = isbn# current_user是實例化后的user模型gift.uid = current_user.idcurrent_user.beans += 0.5db.session.add(gift)db.session.commit() except Exception as e:db.session.rollback()raise e

  這個例子是sqlalchemy操作里時常要使用到的事務回滾的代碼,為了防止本次寫入失敗對下一次寫入的影響,我們時常需要捕捉到異常并回滾到初始狀態。這樣的異常捕獲代碼會多次出現在我們的項目里面,所以我們考慮修改他,如何讓代碼簡化,這時候應當使用contextmanager來解決這個問題。

from contextlib import contextmanagerfrom flask_sqlalchemy import SQLAlchemy as _SQLAlchemy from sqlalchemy import Column, SmallIntegerclass SQLAlchemy(_SQLAlchemy):@contextmanagerdef auto_commit(self):try:yieldself.session.commit()except Exception as e:self.session.rollback()raise edb = SQLAlchemy() @web.route('/gifts/book/<isbn>') @login_required def save_to_gifts(isbn):if current_user.can_save_to_list():with db.auto_commit():# 此時已經支持事務,commit之前都沒有真正提交gift = Gift()gift.isbn = isbn# current_user是實例化后的user模型gift.uid = current_user.idcurrent_user.beans += 0.5db.session.add(gift)

轉載于:https://www.cnblogs.com/Jeffding/p/8759430.html

總結

以上是生活随笔為你收集整理的python的上下文管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。