2014-01-16 73 views
4

我有一個方法,必須根據它們的存在返回三個對象之一。異常的更多pythonic方法?

我實現

try: 
    return Model.objects.get(param=param) 
except Model.DoesNotExist as ex: 
    # go to the next verification 
    pass 

try: 
    return RelatedModel.objects.get(param=param).model 
except RelatedMolel.DoesNotExist as ex: 
    # get the default model 
    pass 

return Model.objects.get_default() 

所以對於蟒蛇的大師的問題 - 它是一個更Python實現比內部try/catch塊或?

try: 
    return Model.objects.get(param=param) 
except Model.DoesNotExist as ex: 

    try: 
     return RelatedModel.objects.get(param=param).model 
    except RelatedModel.DoesNotExist as ex: 

     return Model.objects.get_default() 
+1

「pythonic」=「採取明顯的目標路徑」,主要是。 – millimoose

+0

@millimoose兩條路都明顯對我來說=),但更明顯的是什麼? – erthalion

回答

0

我真的不認爲自己是「蟒蛇大師」,反正這是我的建議是:

  • 爲了使你的代碼易於維護,我明白了,這是一個好主意來限制輸出你的代碼點。
  • 爲了可讀性,另一個好的做法是按預期使用塊:當有一個if塊時,避免將return放在其中:它只使用一個else塊,我認爲這也適用於try...except塊。當然,這隻有在深度不太重要時纔有效。

因此,我會寫這樣的:當你做任何的ex使用

try: 
    res = Model.objects.get(param=param) 
except Model.DoesNotExist: 
    try: 
     res = RelatedModel.objects.get(param.param).model 
    except RelatedModel.DoesNotExist: 
     res = Model.objects.get_default() 
return res 

,沒有必要指定其分配。

+2

我非常不同意用局部變量來擺弄這個讓它更容易閱讀。爲了找出這個函數返回什麼,你必須向後查看分配給'res'的內容。這是一個觀點,是否使得該職能的地方狀態較少,而單一回報較好。 – millimoose

+0

爲了達到目的,我寫了「維護」:我同意閱讀並不容易,但至少你必須遵循所有你的回報價值,看看它是如何發展的。顯然,所有這些分配都必須靠近功能代碼的末尾。可能存在多個「返回」的事實並不能簡化這項工作,並且可能需要完全相同的研究工作。 –

+0

我試圖減少研究工作的數量,而不是僅僅改變甲板椅子來改善代碼的不相關屬性。 (我在回答中試過) – millimoose

2

的文檔告訴我們:

ObjectDoesNotExistdjango.core.exceptions定義。 DoesNotExist是在每個模型類上提供的基礎ObjectDoesNotExist異常的子類,作爲識別無法找到的對象的特定類型的一種方式。

所以我會做的是:

queries = [lambda: Model.objects.get(param=param), 
      lambda: RelatedModel.objects.get(param=param).model, 
      lambda: Model.objects.get_default()] 

for query in queries: 
    try: 
     return query() 
    except ObjectDoesNotExist: 
     pass 

可以說這種方式是不是「顯而易見」的,但它是既平,減少冗餘,保持相關的東西放在一起。

+0

「查詢」或「嘗試」? –

+0

@TravisGriggs「queries」實際上非常出色。 – millimoose