返回元组或None的函数:如何优雅地调用该函数?

14 投票
6 回答
10109 浏览
提问于 2025-04-16 02:34

假设有以下内容:

def MyFunc(a):
  if a < 0:
    return None
  return (a+1, a+2, a+3)

v1, v2, v3 = MyFunc()
# Bad ofcourse, if the result was None

什么是定义一个返回元组的函数的最佳方式,同时又能方便地调用它。目前,我可以这样做:


r = MyFunc()
if r:
  v1, v2, v3 = r
else:
  # bad!!
  pass

我不喜欢这样做的原因是,我必须使用一个单独的变量,然后再把它拆开。

另一种解决方案是,我可以让这个函数返回一个充满空值的元组,这样调用者就可以方便地拆开它……

有没有人能建议一个更好的设计?

6 个回答

8

递归有一种非常优雅且符合Python风格的解决方案。但是:你为什么想要返回None呢?Python有处理错误的方法,那就是抛出一个异常:

class AIsTooSmallError( ArgumentError ): pass

然后

raise AIsTooSmallError( "a must be positive." )

这样做更好的原因是,返回一个值表示你已经完成了处理,并且正在把答案传回去。如果你确实进行了某些处理,这样做是没问题的,但如果你只是立即返回None,那就显得很没必要了。

10

这个应该很好用:

v1, v2, v3 = MyFunc() or (None, None, None)

MyFunc() 返回一个元组时,它会被拆开;如果没有返回元组,就会用一个包含三个 None 的元组来替代。

12

那要不抛出一个 ArgumentError 呢?这样你可以 try 调用它,如果参数不对就处理这个异常。

所以,可以像这样:

try:
    v1, v2, v3 = MyFunc()
except ArgumentError:
    #deal with it

另外,可以看看 katrielalex的回答,里面讲了如何使用 ArgumentError 的子类。

撰写回答