weird TypeError: 'NoneType' object is not iterable

weird TypeError: 'NoneType' object is not iterable

我遇到一个奇怪的错误。作为这些代码,foo()bar() return None,但它仅在迭代 bar()

时引发 TypeError
def foo():
  if True:
    return

  yield 1, 2

def bar():
  return

for a, b in foo():
  print a + b

for a, b in bar():
  print a + b

因为 foo 包含一个 yield 语句,它是一个生成器,所以 return 的结果总是一个生成器对象,即使实际的 yield 语句不能到达。生成器在布尔意义上为真,因此您的结果。

如果你

print foo()
print bar()

你得到

<generator object foo at 0x7f8a79fd5eb0>
None

在您的函数 foobar 中,它们都到达一个空的 return 语句。他们含蓄地 return Nonefoo 仍然会生成迭代器,因为它包含 yield 语句。

因此,当您遍历函数的输出时,foo 将使用迭代器值,而 bar 不会,从而导致 TypeError.

产量 1、2 有所不同。 foo returns:

<generator object foo at 0x7f9e01a91d70>

bar returns:

None

如果您对 yield 部分进行注释,代码也会在 foo() 上崩溃。

您应该 return 为每种方法求解两个值。

如果您的函数不包含 yield 语句并且您希望它 return "empty iterator" 您应该写

def empty()
    raise StopIteration

for each in empty():
    print('this will never show up')