老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Python中如何使用with-創新互聯

創新互聯www.cdcxhl.cn八線動態BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!

成都創新互聯成立與2013年,先為寧津等服務建站,寧津等地企業,進行企業商務咨詢服務。為寧津企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

這篇文章運用簡單易懂的例子給大家介紹Python中如何使用with,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

在實際的編碼過程中,有時有一些任務,需要事先做一些設置,事后做一些清理,這時就需要python with出場了,with能夠對這樣的需求進行一個比較優雅的處理,最常用的例子就是對訪問文件的處理。

一般訪問文件資源時我們會這樣處理:

f = open(r'c:\test.txt', 'r')
data = f.read()
f.close()

這樣寫沒有錯,但是容易犯兩個毛病:

1. 如果在讀寫時出現異常而忘了異常處理。

2. 忘了關閉文件句柄

以下的加強版本的寫法:

f = open(r'c:\test.txt', 'r')
try:
    data = f.read()
finally:
    f.close()

以上的寫法就可以避免因讀取文件時異常的發生而沒有關閉問題的處理了。代碼長了一些。

但使用with有更優雅的寫法:

with open(r'c:\test.txt', 'r') as f:
    data = f.read()

說明:

with后面接的對象返回的結果賦值給f。此例當中open函數返回的文件對象賦值給了f.with會自已獲取上下文件的異常信息。

with是如何做到的呢?

with后面返回的對象要求必須兩__enter__()/__exit__()這兩個方法,而文件對象f剛好是有這兩個方法的,故應用自如。

pytho中官方定義說明如下(https://docs.python.org/2/reference/datamodel.html#context-managers):

object.__enter__(self)
進入與此對象相關的運行時上下文。with語句將將此方法的返回值綁定到語句的AS子句中指定的目標(如果有設置的話)
 
object.__exit__(self, exc_type, exc_value, traceback)
退出與此對象相關的運行時上下文。參數描述導致上下文退出的異常。如果上下文運行時沒有異常發生,那么三個參數都將置為None。
如果有異常發生,并且該方法希望抑制異常(即阻止它被傳播),則它應該返回True。否則,異常將在退出該方法時正常處理。
請注意, __exit__()方法不應該重新拋出傳入的異常,這是調用者的職責。

所謂上下文管理協議,就是咱們打開文件時常用的一種方法:with

__enter__(self):當with開始運行的時候觸發此方法的運行

__exit__(self, exc_type, exc_val, exc_tb):當with運行結束之后觸發此方法的運行

exc_type如果拋出異常,這里獲取異常的類型

exc_val如果拋出異常,這里顯示異常內容

exc_tb如果拋出異常,這里顯示所在位置

下面舉例說明他的原理:

1. 無異常發生時的例子:

#!/user/bin/env python3
#-*- coding:utf-8 -*-
 
class Test:
    def __enter__(self):
        print('__enter__() is call!')
        return self
 
    def dosomething(self):
        print('dosomethong!')
 
    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__() is call!')
        print(f'type:{exc_type}')
        print(f'value:{exc_value}')
        print(f'trace:{traceback}')
        print('__exit()__ is call!')
 
with Test() as sample:
    sample.dosomething()
 
>>
__enter__() is call!
dosomethong!
__exit__() is call!
type:None
value:None
trace:None
__exit()__ is call!

以上的實例Text,我們注意到他帶有__enter__()/__exit__()這兩個方法,當對象被實例化時,就會主動調用__enter__()方法,任務執行完成后就會調用__exit__()方法,另外,注意到,__exit__()方法是帶有三個參數的(exc_type, exc_value, traceback), 依據上面的官方說明:如果上下文運行時沒有異常發生,那么三個參數都將置為None, 這里三個參數由于沒有發生異常,的確是置為了None, 與預期一致。

2. 有異常發生時,會拋出異常的例子:

以下例子在上面稍做了一些修改,讓運行時產生異常,看看這三個參數的賦值情況:

#!/user/bin/env python3
#-*- coding:utf-8 -*-
 
class Test:
    def __enter__(self):
        print('__enter__() is call!')
        return self
 
    def dosomething(self):
        x = 1/0
        print('dosomethong!')
 
    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__() is call!')
        print(f'type:{exc_type}')
        print(f'value:{exc_value}')
        print(f'trace:{traceback}')
        print('__exit()__ is call!')
        # return True
 
 
with Test() as sample:
    sample.dosomething()
>>
__enter__() is call!
Traceback (most recent call last):
__exit__() is call!
type:
  File "C:/Users/xxx/PycharmProjects/Test1/test.py", line 23, in 
value:division by zero
    sample.dosomething()
trace:
  File "C:/Users/xxx/PycharmProjects/Test1/test.py", line 10, in dosomething
__exit()__ is call!
    x = 1/0
ZeroDivisionError: division by zero

從結果可以看出, 在執行到dosomethong時就發生了異常,然后將異常傳給了__exit__(), 依據上面的官方說明:如果有異常發生,并且該方法希望抑制異常(即阻止它被傳播),則它應該返回True。否則,異常將在退出該方法時正常處理。當前__exit__并沒有寫明返回True,故會拋出異常,也是合理的,但是正常來講,程序應該是不希望它拋出異常的,這也是調用者的職責,我們將再次修改__exit__, 將其返回設置為True。

3. 有異常發生時,不再拋出異常的例子:

# 在上面的例子上做點修改.
#!/user/bin/env python3
#-*- coding:utf-8 -*-
 
class Test:
    def __enter__(self):
        print('__enter__() is call!')
        return self
 
    def dosomething(self):
        x = 1/0
        print('dosomethong!')
 
    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__() is call!')
        print(f'type:{exc_type}')
        print(f'value:{exc_value}')
        print(f'trace:{traceback}')
        print('__exit()__ is call!')
        return True
 
 
with Test() as sample:
    sample.dosomething()
 
>>
__enter__() is call!
__exit__() is call!
type:
value:division by zero
trace:
__exit()__ is call!

從結果看,異常拋出被抑制了,符合預期。

關于Python中如何使用with就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


本文題目:Python中如何使用with-創新互聯
網站網址:http://www.xueling.net.cn/article/hgjce.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国产视频精品一区二区三区 | 五月丁香六月综合AV | 国产无遮挡无码裸体视频在现观看 | 国产亚洲精品久久久久久无几年桃 | 国产乱子影视频上线免费观看 | 亚洲av无码之国产精品网址蜜芽 | 黄a在线| 久草久草在线观看 | 日本护士xxxxhd | 日本e片色视频 | 国产噜噜噜噜噜久久久久久久久 | a一级片| 91极品18禁国产在线播放 | 国产婷婷vvvv激情久 | 日韩人妻无码系列专区 | 日本欧美一区二区三区视频麻豆 | 日韩一道本 | 西出玉门40集全免费播放 | 疯狂做受XXXX高潮不断 | 亚洲精品国产综合久久一线 | 69vd视频 | 红尘影院手机在线观看 | 久久久亚洲精品石原莉奈 | 福利社一区二区 | 激情内射亚洲一区二区三区爱妻 | 久久草在线视频播放 | 亚洲黄页一区 | 亚洲天堂男人 | 亚洲成人福利在线 | XXX性XXX国语对白 | 91污污视频 | 日日夜夜网站 | 久久婷婷五月综合色精品 | 久久一日本综合色鬼综合色 | 91视频国 | 草逼欧美 | 中文字幕AAV | 国产精品成人久久久久a级 狠狠色亚洲 | 浴室洗澡偷拍一区二区 | 又黄又湿啪啪响18禁 | 国产一区二区三区视频网站 |