2017-05-05 30 views
3

我有兩種複製文件的方法,哪一種是pythonic/best版本最多的?複製文件時使用try/except或if/else

在通過一個面向對象的教科書的工作中,我被告知(在這裏解釋)最好避免檢查和處理'異常情況'出現時。我在第二版中使用try/except的方式是否有效?

使用if/else第一版本:使用try/except

if os.path.exists(dest): 
    print("\nCopying zipfile to {}".format(dest)) 
    shutil.copy(self.backup_zipfile_name, dest) 
else: 
    print("Cannot find {}.".format(dest)) 

第二個版本:

try: 
    shutil.copy(self.back_zipfile_name, dest) 
except FileNotFoundError: 
    print("{!r} could not be found".format(dest)) 
+1

二。首先有一個競爭條件。 –

回答

2

絕對的第二個。

很容易將您的程序步驟視爲連續操作,其間沒有其他任何事情發生。但這並不是真正的電腦(至少是現代非嵌入式電腦)的工作原理。

在您檢查路徑是否存在以及實際嘗試寫入其中之後,其他程序可能會輕易出現並將其刪除,從而導致未捕獲的運行時異常。這是一個常見的併發錯誤。

因此,在使用文件系統,網絡或任何其他您不完全控制的外部資源時,總是使用try/catch(或者Python的案例,try/except)。

Here是一個很好的資源和更深入的解釋。

2

編輯:我認爲@Jared Smiths的回答更適合那個特定的用例(訪問文件系統)。


這是由大家說,但這是它在python文檔中提到的內容供大家參考。

LBYL

三思而後行。這種編碼風格在進行調用或查找之前明確地測試前提條件。這種風格與EAFP方法形成對比,其特點是存在許多if語句。

在多線程環境中,LBYL方法可能會在「查找」和「跳躍」之間引入競態條件。例如,如果另一個線程在測試之後但在查找之前從映射中除去密鑰,則密碼映射中的密鑰:return mapping [key]可能會失敗。這個問題可以通過鎖定或使用EAFP方法來解決。

EAFP

更容易請求原諒比許可。這種常見的Python編碼風格假定存在有效的鍵或屬性,並且如果假設證明是錯誤的,則捕獲異常。這種乾淨而快速的風格的特點是存在許多嘗試和除外聲明。該技術與許多其他語言(例如C語言)通用的LBYL風格形成對比。

https://docs.python.org/2/glossary.html

+2

請注意,競爭條件不需要多線程:任何其他程序都可以在單線程順序代碼中操縱文件系統。或者司機可能會崩潰。或者其他六種其中的任何一種都可能出錯。 –

+0

@JaredSmith,它將檢查'if os.path.exists(dest)'。但機會只是兩行代碼執行之間的時間。 – itzMEonTV

+2

@L_S就夠了。這兩個步驟之間會發生多少個CPU週期? Python解釋器將您的代碼轉換爲計算機運行的機器語言,您是否知道OS調度器(針對每個不同平臺)如何釋放CPU時間來運行它的詳細信息?相信我,有足夠的時間去解決問題。這是每種語言的常見反模式(不僅僅是Python)。 –