python的上下文管理
生活随笔
收集整理的這篇文章主要介紹了
python的上下文管理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
說道上下文管理首先想到的就是這個:
class MyResource:def __enter__(self):print("查詢開始")return selfdef __exit__(self, exc_type, exc_val, exc_tb):print("查詢結(jié)束")def query(self):print("查詢中")with MyResource() as f:f.query()執(zhí)行結(jié)果
查詢開始 查詢中 查詢結(jié)束但是我們這里要說的不是這個,
from contextlib import contextmanagerclass MyResource:def query(self):print("查詢中")@contextmanager def make_myresource():print("查詢開始")yield MyResource()print("查詢結(jié)束")# 這里的f是yield后面返回的實例 with make_myresource() as f:f.query()python給了我們一個contextmanager,contextmanager最大的好處就是可以將不是上下文處理器的類變成一個類似上下文處理的方式來解決問題。
上面的運行結(jié)果依然是:
查詢開始 查詢中 查詢結(jié)束簡單的例子,我想把我一本圖書的名字加上書名號輸出:
from contextlib import contextmanager@contextmanager def make_myresource():print("《", end='')yieldprint("》")# 這里的f是yield后面返回的實例 with make_myresource():print("my world", end='') 《my world》下面看一個例子:
try:# 此時已經(jīng)支持事務(wù),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操作里時常要使用到的事務(wù)回滾的代碼,為了防止本次寫入失敗對下一次寫入的影響,我們時常需要捕捉到異常并回滾到初始狀態(tài)。這樣的異常捕獲代碼會多次出現(xiàn)在我們的項目里面,所以我們考慮修改他,如何讓代碼簡化,這時候應(yīng)當(dāng)使用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():# 此時已經(jīng)支持事務(wù),commit之前都沒有真正提交gift = Gift()gift.isbn = isbn# current_user是實例化后的user模型gift.uid = current_user.idcurrent_user.beans += 0.5db.session.add(gift)轉(zhuǎn)載于:https://www.cnblogs.com/Jeffding/p/8759430.html
總結(jié)
以上是生活随笔為你收集整理的python的上下文管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20165331 第六周学习总结
- 下一篇: 第十篇 Form表单