重要的是要知道哪个迭代会导致错误。这肯定在回溯中指出,但在这种情况下,回溯不是必需的(继续阅读)。
生成器上的迭代是一个问题吗?
看完之后,很明显,但值得澄清的是:
空生成器不是NoneType
,因此迭代它不会导致这样的问题:
>>> def test_generator():
for i in []:
yield i
>>> list(test_generator()) # proof it is empty
[]
>>> for x in test_generator():
pass
>>>
生成器在定义期间被 Python 识别(我正在简化)并且尝试混合生成器和简单函数(例如,通过使用条件,如下所示)将是语法错误:
>>> def test_generator_2(sth):
if sth:
for i in []:
yield i
else:
return []
SyntaxError: 'return' with argument inside generator (<pyshell#73>, line 6)
生成器内部的迭代是否有问题?
基于上面的结论是错误不是通过迭代器迭代,而是在创建它时会发生什么(生成器中的代码):
def iterate_my_objects_if_something(self):
for x in self.my_objects: # <-- only iteration inside generator
if x.something:
yield x
所以看起来在某些情况下self.my_objects
变成了None
.
解决方案
要解决该问题: