2011-02-02 148 views
3

我正在寫一個方法,它返回成功的元組,但失敗時返回None。我還沒有敲定None(作爲失敗案例返回),但它是其中一個選擇。我們可以返回-1,-1的失敗案例嗎?我正在尋找最佳pythonic方式來實現這一目標,因此拆包很容易。從方法返回元組

請讓我知道我們如何才能改善它。僞代碼如下所示

def myFunc(self): 
    if self.validate() != 0: 
     return 
    x,y = self.getXY() 

    return x,y 
+0

爲什麼?引發異常有什麼問題? – 2011-02-02 12:29:06

回答

14

如果出現故障,爲什麼不提示異常?

你當然可以返回(-1,-1)作爲失敗,但在我看來這不是一個好的解決方案。

請記住,在Python EAFP(容易問寬恕比權限)比LBYL(看你之前的飛躍)更受青睞。

這意味着只要在假設下編寫代碼,所有代碼都能正常工作,然後捕獲適當的例外情況會更好。

你的代碼,那麼有可能成爲

def myFunc(self): 
    if self.validate() != 0: 
     raise CustomNotValidatedException() 
    x,y = self.getXY() 

    return x,y 

我會改善通過以下方式代碼:

  • 化妝self.validate()返回0時,結果並不積極,使您可以更改pythonic方式更改第二行:

    if not self.validate(): 
    
  • 刪除int通過改變return語句ermediate x, y變量:

    return self.getXY() 
    

最後,你可能只是引發異常內getXY()並在代碼中直接使用此方法。

+2

+1:異常比返回奇怪的代碼值更好。 – 2011-02-02 12:28:01

+0

你的意思是在`validate()`中引發異常,也許?我假設這裏的`getXY()`或者不是作爲公共接口的一部分(儘管如此,所有的命名都是奇怪的),或者是作爲發佈代替實際代碼的存根(儘管也許它真的應該重構成一個幫手:))。 – 2011-02-02 12:53:30

3

如果這是爲了捕捉編程錯誤,那麼斷言更清晰。

def my_function(self): 
    assert self.validate() 
    return self.x, self.y 

如果要捕捉運行時錯誤(可能是用戶提供的數據),則異常情況會更好。

def my_function(self): 
    if not self.validate(): 
     raise ValidationError 
    return self.x, self.y 

這裏一個很好的選擇會爲self.validate(),以提高驗證錯誤本身:這將允許例如消息被提供給驗證錯誤的原因。