日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python的上下文管理

發布時間:2025/7/25 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的上下文管理的全部內容,希望文章能夠幫你解決所遇到的問題。

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