从方法返回元组

3 投票
2 回答
11736 浏览
提问于 2025-04-16 11:04

我正在写一个方法,这个方法在成功时会返回一个元组,但在失败时会返回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() 方法里抛出异常,然后在你的代码中直接使用这个方法。

撰写回答