<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      python中的上下文管理器以及python內建模塊contextlib的contextmanager方法

      上下文管理器

      上下文管理器是實現了上下文管理協議的對象,其特有的語法是“with …as”。主要用于保存和恢復各種全局狀態,關閉文件等,并為try…except…finally提供了一個方便使用的封裝。

      上下文管理協議具體來說就是在類里面實現以下兩個方法:

      _enter_(): 從該方法進入運行時上下文,并返回當前對象或者與運行時上下文相關的其他對象。如果with語句有as關鍵詞存在,返回值會綁定在as后的變量上。

      _exit_(exc_type, exc_val, exc_tb): 退出運行時上下文,return True 如果 with 執行體有異常,則不會繼續向上拋出異常;return Flase 如果 with 執行體有異常,則繼續向上拋出異常。如果在執行with語句體時發生異常,那退出時參數會包括異常類型、異常值、異常追蹤信息,否則,3個參數都是None。
      下面,我們可以自己定義一個類來通過with進行上下文管理:

      class MyContextManager:
      
          def __enter__(self):
              print("connect to contextmanager")
              return self  # return返回的可以是對象,會綁定給as后面的變量
      
          def __exit__(self, exc_type, exc_val, exc_tb):
              """__exit__方法中:
                      1.如果return False:執行query_data方法有異常,則異常繼續往上拋
                      2.如果return True:執行query_data方法有異常,則異常不會往上拋
              """
              print('close the contextmanager')
              # return False
              return True
      
          def query_data(self):
              print('query data')
      
      
      with MyContextManager() as m:
          m.query_data()

      執行以上代碼,運行結果如下:

      下面,我們在類的query_data方法中增加一個報錯的a,當__exit__方法 return True 時,如下:

      class MyContextManager:
      
          def __enter__(self):
              print("connect to contextmanager")
              return self  # return返回的可以是對象,會綁定給as后面的變量
      
          def __exit__(self, exc_type, exc_val, exc_tb):
              """__exit__方法中:
                      1.如果return False:執行query_data方法有異常,則異常繼續往上拋
                      2.如果return True:執行query_data方法有異常,則異常不會往上拋
              """
              print('close the contextmanager')
              # return False
              return True
      
          def query_data(self):
              a
              print('query data')
      
      
      with MyContextManager() as m:
          m.query_data()

      運行結果如下:并不會執行 query_data() 方法

      當__exit__方法 return False 時,如下:

      class MyContextManager:
      
          def __enter__(self):
              print("connect to contextmanager")
              return self  # return返回的可以是對象,會綁定給as后面的變量
      
          def __exit__(self, exc_type, exc_val, exc_tb):
              """__exit__方法中:
                      1.如果return False:執行query_data方法有異常,則異常繼續往上拋
                      2.如果return True:執行query_data方法有異常,則異常不會往上拋
              """
              print('close the contextmanager')
              return False
              # return True
      
          def query_data(self):
              a
              print('query data')
      
      
      with MyContextManager() as m:
          m.query_data()

      運行結果如下:會拋異常,

      實際應用示例:

      創建一個上下文管理器,這個上下文管理器將會創建一個SQLite數據庫連接,當任務處理完畢,將會將其關閉。

      import sqlite3
      
      class DataConn:
          def __init__(self,db_name):
              self.db_name = db_name
      
          def __enter__(self):
              self.conn = sqlite3.connect(self.db_name)
              return self.conn
      
          def __exit__(self,exc_type,exc_val,exc_tb):
              self.conn.close()
              if exc_val:
                  raise
      
      if __name__ == "__main__":
          db = "test/test.db"
          with DataConn(db) as conn:
              cursor = conn.cursor()

      在上面的代碼中,我們創建了一個類,獲取到SQLite數據庫文件的路徑。__enter__方法將會自動執行,并返回數據庫連接對象。現在我們已經獲取到數據庫連接對象,然后我們創建光標,向數據庫寫入數據或者對數據庫進行查詢。當我們退出with語句的時候,它將會調用__exit__方法用于執行和關閉這個連接。

      Python的內建模塊 contextlib

      對于上下文的管理,python也提供了內建的模塊contextlib來實現相同的機制,而且這種通過生成器和裝飾器實現的上下文管理器,看起來比with語句和手動實現上下文管理協議更優雅。

      from contextlib import contextmanager
      
      
      class MyContextManager:
          def query_data(self):
              # a
              print('query data')
      
      
      @ contextmanager  # 有了contextmanager我們就不需要手動實現enter和exit方法
      def make_context_manager():
          print('connect to contextmanager')
          yield MyContextManager()  # yield就相當于return,但是不會結束函數,而是暫時掛起,如果我們后續需要的話,繼續調用這個函數,會從上次掛起的地方繼續執行
          print('close the contextmanager')
      
      
      with make_context_manager() as mc:
          mc.query_data()

       

      posted @ 2023-02-09 18:10  _yessir  閱讀(118)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 妺妺窝人体色www看美女| 国产自产一区二区三区视频 | 亚洲中文字幕一区精品自| 啊轻点灬大JI巴太粗太长了在线| 亚洲欧洲日产国码久在线| 亚洲欧洲精品日韩av| 国产免费无遮挡吸奶头视频| 精品国产中文字幕懂色| 成av免费大片黄在线观看| 久久精品免视看国产成人| 麻豆一区二区三区蜜桃免费| 国产v综合v亚洲欧美大天堂| 精品久久久久无码| 夜夜春久久天堂亚洲精品| 亚洲无线码一区在线观看| 中文字幕日韩有码av| 久久国产精品老女人| 国产边摸边吃奶边叫做激情视频| 日本丰满熟妇hd| 日韩女同一区二区三区久久| 熟女一区二区中文字幕| 茄子视频国产在线观看| 久热这里有精品视频播放| 激情在线一区二区三区视频| 国产玖玖视频| 夜夜躁日日躁狠狠久久av| 国产福利深夜在线播放| 日本免费一区二区三区最新vr | 国产乱子伦视频在线播放| 中国农村真卖bbwbbw| 国产激情无码一区二区三区| 色综合久久一区二区三区| 亚洲男人的天堂在线观看| 亚洲爆乳WWW无码专区| 亚洲精品一区二区三区蜜| 中文字幕有码高清日韩| 国产精品久久无码一区| 国产激情第一区二区三区| 亚洲综合中文字幕第一页| 国产av剧情无码精品色午夜| 亚洲a∨国产av综合av|