我正在编写一个方法,该方法在成功时返回元组,但在失败时返回None
。我还没有最终确定None
(作为失败案件的回复),但这是其中一个选择。我们可以针对失败案件返回-1,-1
吗?我正在寻找最好的pythonic方法来实现这一点,以便拆包很容易。
请告诉我们如何改进它。伪代码如下:
def myFunc(self):
if self.validate() != 0:
return
x,y = self.getXY()
return x,y
答案 0 :(得分:14)
如果出现故障,为什么不提出异常?
你当然可以将(-1,-1)作为失败返回,但在我看来这不是一个好的解决方案。
请记住,在Python中,EAFP(比请求更容易请求宽恕)比LBYL更受青睐(在你跳跃之前看看)。
这意味着,只要在所有工作都有效的假设下编写代码,然后捕获适当的异常就更好了。
您的代码可能会变成
def myFunc(self):
if self.validate() != 0:
raise CustomNotValidatedException()
x,y = self.getXY()
return x,y
我会通过以下方式改进您的代码:
make self.validate()在结果不为正时返回0,以便您可以以更加pythonic的方式更改第二行:
if not self.validate():
通过将return语句更改为:
来删除中间x, y
变量
return self.getXY()
最后,您可以在getXY()
中引发异常,并在代码中直接使用此方法。
答案 1 :(得分: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()自己引发验证错误:这将允许提供一条消息,提供验证错误的原因。