myFunct
预计会返回两个值。两个返回值都被捕获到var_1, var_2
。
作为错误检查我在函数范围内使用了很多if/else: return
语句,在这种情况下称为myFunct
。输入简单的if arg<10: return
会返回单 None
,因为有两个变量,所以会引发TypeError: 'NoneType' object is not iterable
:var_1, var_2 = myFunct(5)
期待两个返回的值但只有一个值{返回{1}}。
为了避免这样的错误,我必须使用以下语法:
None
我觉得很难看。
我想知道是否有更好的方法来做到这一点......
if arg<10: return None, None
答案 0 :(得分:3)
如果某些内容被破坏,正确的解决方案就是引发异常。但是,如果您绝对不想这样做,您可以随时:
try:
var_1, var_2 = myFunct(5)
except TypeError:
var_1, var_2 = (None,None)
编辑:
如果你的var_1
和var_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