>>len(src)20>>>fp<_io.TextIOWrapperna" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python中的上下文管理器和with語句塊

系統 2059 0

上下文管理器對象存在的目的就是管理with語句。上下文管理器協議包含__enter__ 和__exit__ 兩個方法。with 語句開始運行時,會在上下文管理器對象上調用__enter__ 方法。with 語句運行結束后,會在上下文管理器對象上調用__exit__ 方法

來看一個例子,把文件對象當成上下文管理器使用

            
              
                with
              
              
                open
              
              
                (
              
              
                'test.dat'
              
              
                )
              
              
                as
              
               fp
              
                :
              
              
    secc 
              
                =
              
               fp
              
                .
              
              read
              
                (
              
              
                20
              
              
                )
              
              
                >>
              
              
                >
              
              
                len
              
              
                (
              
              src
              
                )
              
              
                20
              
              
                >>
              
              
                >
              
               fp 

              
                <
              
              _io
              
                .
              
              TextIOWrapper name
              
                =
              
              
                'mirror.py'
              
               mode
              
                =
              
              
                'r'
              
               encoding
              
                =
              
              
                'UTF-8'
              
              
                >
              
              
                >>
              
              
                >
              
               fp
              
                .
              
              closed
              
                ,
              
               fp
              
                .
              
              encoding 

              
                (
              
              
                True
              
              
                ,
              
              
                'UTF-8'
              
              
                )
              
              
                """
但是不能在fp 上執行I/O 操作,因為在with 塊的末尾,調用TextIOWrapper.__exit__
方法把文件關閉了。
"""
              
              
                >>
              
              
                >
              
               fp
              
                .
              
              read
              
                (
              
              
                60
              
              
                )
              
              
Traceback 
              
                (
              
              most recent call last
              
                )
              
              
                :
              
              
File 
              
                "
                
                  "
                
              
              
                ,
              
               line 
              
                1
              
              
                ,
              
              
                in
              
              
                <
              
              module
              
                >
              
              
ValueError
              
                :
              
               I
              
                /
              
              O operation on closed 
              
                file
              
              
                .
              
            
          

執行with后面的表達式得到的結果是上下文管理器對象,不過,把值綁定到目標變量上(as子句)是上下文管理器調用__enter__方法的結果

來看一個例子,自己實現一個上下文管理器

            
              
                class
              
              
                Sample
              
              
                (
              
              
                )
              
              
                :
              
              
                def
              
              
                __enter__
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                "in __enter__"
              
              
                )
              
              
                return
              
               self
        
    
              
                def
              
              
                __exit__
              
              
                (
              
              self
              
                ,
              
               exc_type
              
                ,
              
               exc_val
              
                ,
              
               exc_tb
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                "in __exit__"
              
              
                )
              
              
                def
              
              
                do_something
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                "i am doing something"
              
              
                )
              
              
                >>
              
              
                >
              
              
                with
              
               Sample
              
                (
              
              
                )
              
              
                as
              
               sample
              
                :
              
              
        sample
              
                .
              
              do_something
              
                (
              
              
                )
              
              
                in
              
               __enter__
i am doing something

              
                in
              
               __exit__

            
          

真個過程運行如下,enter()方法被執行,enter()方法返回值,在這里是類自身,執行代碼塊sample.do_something(), 最后是exit()方法被調用

contextlib模塊中的使用工具

@contextmanager 裝飾器能減少創建上下文管理器的樣板代碼量,因為不用編寫一個完整的類,定義__enter__ 和__exit__方法,而只需實現有一個yield 語句的生成器,生成想讓__enter__ 方法返回的值。
在使用@contextmanager 裝飾的生成器中,yield語句的作用是把函數的定義體分成兩部分**:yield 語句前面的所有代碼在with 塊開始時(即解釋器調用__enter__方法時)執行,yield 語句后面的代碼在with 塊結束時(即調用__exit__ 方法時)執行**

看一個使用contextmanager實現上下文管理器的例子

            
              
                import
              
               contextlib
@contextlib
              
                .
              
              contextmanager

              
                def
              
              
                Sample
              
              
                (
              
              
                )
              
              
                :
              
              
                def
              
              
                do_something
              
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                'i am doing something'
              
              
                )
              
              
                print
              
              
                (
              
              
                "in __enter__"
              
              
                )
              
              
                yield
              
               do_something
    
              
                print
              
              
                (
              
              
                "in exit"
              
              
                )
              
              
                >>
              
              
                >
              
              
                with
              
               Sample
              
                (
              
              
                )
              
              
                as
              
               sample
              
                :
              
              
        sample
              
                (
              
              
                )
              
              
                in
              
               __enter__
i am doing something

              
                in
              
               __exit__

            
          

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩一区二区不卡中文字幕 | 免费成人高清视频 | 青春草久久 | 鲁鲁狠色综合色综合网站 | 国内久久久久高清影视 | 91久久亚洲精品国产一区二区 | 欧美一级片 在线播放 | 欧美国产日韩精品 | 免费国产黄线在线观看视频 | www.啪啪.com| 欧美激情二区 | 国产欧美一区二区精品性色99 | 亚洲精品一二三四区 | 国产目拍亚洲精品区一区 | 热久久亚洲 | 色中色污| 国产dvd毛片在线视频 | 欧美成人免费一区在线播放 | 日产国产精品久久久久久 | 国产免费高清视频 | 黄页免费观看1 | 久久免费精品视频在线观看 | 日本免费不卡视频 | 国产精品 色 | 一二区| 久久在线中文字幕 | 久草综合在线观看 | 日韩欧美亚洲一区 | 美女美女高清毛片视频 | 日日日日日日bbbbb视频 | 亚洲婷婷综合中文字幕第一页 | 欧美日韩一区二区三区久久 | 久久久久久久99久久久毒国产 | 久久伊人影视 | 一级毛片免费视频观看 | 日本夜爽爽一区二区三区 | 99精品国产一区二区三区 | 精品久久久久久中文字幕 | 老司机福利精品 | 精品视频入口 | 全免费a级毛片免费看不卡 全免费a级毛片免费看视频免 |