2017-09-06 50 views
1

我想知道如何寫出最好/最pythonic的情況:如果可以做到,那就做吧。如果不是,就放手吧。什麼是「如果可能,做到這一點」的pythonic方式?

例如: 我有一個從數據庫加載數據的函數。如果給出可寫的目標,則將數據寫入文件。獨立於正在寫入或未寫入的文件,數據總是被返回。我可以當然檢查是否有可寫的位置,如果是這樣的話,將數據寫入文件。但它似乎是一種非pythonic的方式,我認爲「最好是要求寬恕而不是許可」。

我實現這個像這樣:

def loadData(dest=False): 
    data = someDBRequest() 
    try: 
     with open(dest, 'w') as fh: 
      json.dump(data, fh) 
    except: 
     pass 
    return data 

,因爲我實現了一個無用的,除了這種莫名其妙的感覺不好,畢竟我預計DEST不總是被設置爲一個位置,因爲該函數可以不設置它被稱爲。我也覺得這不是一個應該以某種方式記錄或處理的錯誤。

這是一個正確的方法,或者你會建議更好/更pythonic?

+0

另一個原則是「顯式優於隱式」。我也不認爲你在這裏寫的代碼是非常可讀的,你不喜歡它自己。只要做一些最適合你的事。 如果dest提供但不可寫,你真的不想提醒嗎? – philippd

回答

4

在這個特定的情況下,我會默認destNone,並會明確檢查它是否爲None

如果你也想安靜地失敗,如果dest給出但無效,你可以使用你的方法。不過,我會主張用except IOError來替換整個except條款。否則,你可能抓住的東西像SyntaxError

def loadData(dest=None): 
    data = someDBRequest() 
    if dest: 
     try: 
      with open(dest, 'w') as fh: 
       json.dump(data, fh) 
     except IOError: 
      pass 
    return data 

在一般情況下,如果你不要靠「這是更好地請求原諒比許可」的成語,我認爲這是最好把儘可能少的代碼儘可能在try區塊內,儘可能少地捕捉異常。

1

與Python 3.4開始有一個新的工具contextlib.suppress,允許寫類似的代碼沒有except Exception: pass線。

小例如從docs引述:

from contextlib import suppress 

with suppress(FileNotFoundError): 
    os.remove('somefile.tmp') 

技術上它是一種上下文管理器和這一個是可重入的(解釋here)和可重複使用的。這意味着您不必每次創建一個新的,例如:

os_errors_ignored = contextlib.suppress(OSError) 

with os_errors_ignored: 
    # do something 

with os_errors_ignored: 
    # do something else 
相關問題