循环遍历空迭代器不会引发异常

问题描述

您可以使用语句,也可以使用循环子句

循环语句可以有一个else子句;当循环 可迭代 时执行。

例如:

iterator = []
for element in iterator:
    print('This wont print..')
else:
    assert iterator

结果将是:

Traceback (most recent call last):
  File "<pyshell#2>", line 4, in <module>
    assert iterator
AssertionError

解决方法

我使用的是Python 3.6.7。

我只是注意到,for空列表上的循环甚至不会循环一次。经过一番思考,这对我来说很有意义。即,大小为零(空)的对象上的循环返回零迭代。

iterable = []
for element in iterable:
    pass
print(element)
>>> NameError: name 'element' is not defined

这意味着如果,则不会执行循环内的测试len(iterable) == 0

iterable = []
for element in iterable:
    assert isinstance(element,int)
#nothing happens

那我怎样才能抓住这种情况呢?

当由于iterable为空而导致循环不运行时,是否存在一种紧凑的内置方法来引发错误?

捕获这种特殊情况需要手动进行:

  • iterator在循环之前测试s是否非空
  • 在循环之后测试是否定义了元素。这两种方法对我来说都不是优雅的

我可能最终在每个for循环中都进行了此测试。

assert len(iterable) > 0
#loop

要么

#loop
assert "element" in dir() #?