【发布时间】:2020-05-20 05:04:29
【问题描述】:
我使用的是 Python 3.6.7。
我刚刚注意到一个空列表上的for 循环甚至不会循环一次。
经过一番思考,这对我来说有点道理。 IE。对零大小(空)对象的循环返回零迭代。
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
那我怎样才能捕捉到这种情况呢?
当我的循环因为可迭代对象为空而无法运行时,是否有一种紧凑的内置方法来引发错误?
捕捉这种特殊情况需要手动:
- 在循环之前测试
iterator是否为非空 - 在循环之后测试元素是否已定义。两者都不 方法对我来说似乎很优雅
我最终可能会在每个 for 循环中进行此测试。
assert len(iterable) > 0
#loop
或
#loop
assert "element" in dir() #?
【问题讨论】:
-
你可以只使用
assert len(iterator) > 0而不是assert iterator- 空迭代器是错误的:bool([]) == False。 -
请注意,默认情况下迭代器既没有长度也没有布尔意义。 Iterables 可以,但它们只是充当迭代器的一小部分。
-
您的问题到底是什么?你想捕获空迭代器,你想断言一个空迭代器的嵌套类型,你想要一个空迭代器有用的例子,你想在空循环上引发异常,...?
-
MisterMiyagi 我已经不再考虑使用空迭代器了。这使得问的问题更清楚(
Is there a compact built-in way to raise an error when my loop does not run because the iterable is empty?) -
MisterMyagi 我编辑并替换了
iterator为iterable
标签: python python-3.x for-loop