从方法返回元组
我正在写一个方法,这个方法在成功时会返回一个元组,但在失败时会返回None
。我还没有最终决定用None
作为失败的返回值,但这是一个选择。我们可以用-1,-1
来表示失败吗?我想找到一种最符合Python风格的方法,这样在解包时会更简单。
请告诉我我们可以如何改进。下面是伪代码:
def myFunc(self):
if self.validate() != 0:
return
x,y = self.getXY()
return x,y
2 个回答
3
如果这是为了捕捉编程错误,那么使用 assert 更简洁。
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() 自己抛出验证错误:这样可以提供一个消息,说明验证错误的原因。
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,这样你可以用更符合Python风格的方式修改第二行:
if not self.validate():
通过修改返回语句来去掉中间的
x, y
变量,变成:return self.getXY()
最后,你可以直接在 getXY()
方法里抛出异常,然后在你的代码中直接使用这个方法。