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
在您的函数 foo
和 bar
中,它们都到达一个空的 return
语句。他们含蓄地 return None
。 foo
仍然会生成迭代器,因为它包含 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')
我遇到一个奇怪的错误。作为这些代码,foo()
和 bar()
return None
,但它仅在迭代 bar()
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
在您的函数 foo
和 bar
中,它们都到达一个空的 return
语句。他们含蓄地 return None
。 foo
仍然会生成迭代器,因为它包含 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')