2011-02-02 102 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(),以提高验证错误本身:这将允许例如消息被提供给验证错误的原因。