当预期有多个返回值时,如何很好地从函数返回

时间:2014-06-05 04:11:11

标签: python

myFunct预计会返回两个值。两个返回值都被捕获到var_1, var_2

作为错误检查我在函数范围内使用了很多if/else: return语句,在这种情况下称为myFunct。输入简单的if arg<10: return会返回 None,因为有两个变量,所以会引发TypeError: 'NoneType' object is not iterablevar_1, var_2 = myFunct(5)期待两个返回的值但只有一个值{返回{1}}。

为了避免这样的错误,我必须使用以下语法:

None

我觉得很难看。

我想知道是否有更好的方法来做到这一点......

if arg<10: return None, None

4 个答案:

答案 0 :(得分:3)

如果某些内容被破坏,正确的解决方案就是引发异常。但是,如果您绝对不想这样做,您可以随时:

try:
    var_1, var_2 = myFunct(5)
except TypeError:
    var_1, var_2 = (None,None)

编辑:

如果你的var_1var_2确实存在,那么你可能需要考虑一下你将要做什么。如果要继续计算None是有效输入,那么return None,None可能是正确的表达式。但是,如果这是一个例外,并且你要注意结果是None,并且做了一些完全不同的事情(没有两个值),那么你总是可以这样做:

result = myFunct(5)
if result:
    var_1,var_2=result
    do_more_stuff_here_with(var_1 and var_2) # logical and :)
else:
    print "myFunct(5) failed - check (and if necessary adjust) the phase of the moon"

答案 1 :(得分:2)

虽然这是有争议的,但通常认为单点退出是一种好习惯。换句话说,只有一个return语句。您可以按照以下方式完成此操作,

def myFunc(arg):
    result1, result2 = None, None
    if not arg < 10:
        result1, result2 = 100,200
    return result1, result2

现在显然,您的玩具示例非常简单,您可以通过更多pythonic方式简化此特定示例,例如:

def myFunc(arg):
    return (None, None) if arg < 10 else (100,200)

单点退出是进入我的复杂功能的好习惯。

正如其他人所指出的那样,提出异常是表示函数达到错误状态的最pythonic方式。作为返回的None通常仅用于表示基本上相当于空列表的信号,I.E。什么都没有得到回报是该功能的预期可能结果。

答案 2 :(得分:2)

一位可爱的装饰师怎么样?

import decorator

def default_return_value(value):
    @decorator.decorator
    def decorate(f, *args, **kwargs):
        x = f(*args, **kwargs)
        return value if x is None else x
    return decorate

def returns_tuple(size):
    return default_return_value(tuple([None] * size))

@returns_tuple(size=2)
def myFunct(arg):
    if arg >= 10:
        return 100, 200

>>> myFunct(15)
(100, 200)

>>> myFunct(5)
(None, None)

答案 3 :(得分:1)

将结果存储在单个变量中,然后根据需要展开

result = myFunct(5)
var_1, var_2 = (None, None) if result is None else result