返回元组或None的函数:如何优雅地调用该函数?
假设有以下内容:
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 的子类。