函数返回元组或无:如何很好地调用该函数?

Eli*_*any 13 python tuples return

假设如下:

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
Run Code Online (Sandbox Code Playgroud)

定义一个返回元组的函数的最佳方法是什么,但是可以很好地调用它.目前,我可以这样做:


r = MyFunc()
if r:
  v1, v2, v3 = r
else:
  # bad!!
  pass
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个是我必须使用单个变量然后解压缩它.

另一个解决方案是我可以让函数返回一个充满Nones的元组,这样调用者可以很好地解压....

任何人都可以建议更好的设计?

Ski*_*ick 12

如何养一个ArgumentError?然后你可以try调用它,并在参数错误时处理异常.

所以,像:

try:
    v1, v2, v3 = MyFunc()
except ArgumentError:
    #deal with it
Run Code Online (Sandbox Code Playgroud)

另外,请参阅katrielalex的使用ArgumentError子类的答案.

  • 这很好,但我总是担心引发和处理异常的开销 (3认同)

rec*_*ive 10

这应该很好地工作:

v1, v2, v3 = MyFunc() or (None, None, None)
Run Code Online (Sandbox Code Playgroud)

MyFunc()返回一个元组时,它将被解压缩,否则它将被替换为3元组None.

  • @Skilldrick:很漂亮! (2认同)

Kat*_*iel 8

recursive拥有真正优雅的Pythonic解决方案.但是:你为什么要回来None?Python有一种处理错误的方法,那就是引发异常:

class AIsTooSmallError( ArgumentError ): pass
Run Code Online (Sandbox Code Playgroud)

然后

raise AIsTooSmallError( "a must be positive." )
Run Code Online (Sandbox Code Playgroud)

更好的原因是返回一个值表示您已完成处理并正在传回您的答案.如果你做了一些处理,这很好,但如果你马上回来就很傻None.