如何在Python中避免对None进行for-in循环
我知道我可以在代码周围加一些if
语句来避免这个问题,但我想找一种更好的做法,或者说是处理这种编程问题的好方法。
我正在循环处理一个函数的结果,但没有先把结果存储到一个单独的变量里;就像这样:
for item in mycustimitemgetter.itter():
dosomething()
这个itter
函数返回的是None
,而不是一个空列表[]
,这导致Python抛出一个异常。这个行为是Python正常的表现,没什么问题。但我想找到一个更好的解决方案来:
a) 保持代码简洁明了(不把结果存到变量里,也不去做if != None
之类的判断)
b) 把None
的返回值当作一个空列表来处理,也就是说不执行循环,默默地忽略函数返回None
这个事实。
2 个回答
9
你有一个叫做 itter()
的方法,它会返回一个可迭代的对象。根据这个函数的名字,我们可以合理地认为“返回的值应该总是可以被迭代”。所以,如果你要返回一个列表的话,如果没有值,就应该返回一个空列表。
在你的代码中可以执行一些操作。添加以下内容是完全没问题的:
if retval is None:
return []
return retval
或者
return retval or []
根据你使用的类型,把这些放在 itter()
实现的末尾也是可以的。
想一想:你写了这段代码,现在遇到了这个问题。那么,如果其他人想用你的代码,但不知道你知道的这些,他们会期待什么呢?
另外,如果合适的话,你可以使用生成器。生成器里面有一个 'next' 方法(可以查看链接中的文档),如果没有值的话,你可以返回 false。
30
也许可以利用这样一个事实:空列表[]
和None
在判断时都被认为是假的,而有内容的列表则被认为是真的。
for item in (mycustimitemgetter.itter() or []):
dosomething()