Python-3.2协程:AttributeError:'generator'对象没有'next'属性
Python-3.2协程:AttributeError:'generator'对象没有'next'属性
引用自《Python Essential Reference》(:David Beazley),第20页:
通常情况下,函数操作的是一组单一的输入参数。然而,函数也可以被编写成处理发送给它的一系列输入的任务。这种类型的函数被称为协程,使用
yield
语句作为表达式(yield)来创建,如下所示的例子:
def print_matches(matchtext): print "Looking for", matchtext while True: line = (yield) # 获取一行文本 if matchtext in line: print line
要使用这个函数,首先调用它,将其推进到第一个(yield)的位置,然后使用
send()
向其发送数据。例如:
>>> matcher = print_matches("python") >>> matcher.next() # 推进到第一个(yield) Looking for python >>> matcher.send("Hello World") >>> matcher.send("python is cool") python is cool >>> matcher.send("yow!") >>> matcher.close() # 完成 matcher 函数调用
基于这些信息,我编写了以下代码:
#!/usr/bin/python3.2 import sys def match_text(pattern): line = (yield) if pattern in line: print(line) x = match_text('apple') x.next() for line in input('>>>> '): if x.send(line): print(line) x.close()
但是我得到了一个错误消息:
Traceback (most recent call last): File "xxx", line 9, inmatcher.next() # 推进到第一个(yield) AttributeError: 'generator' object has no attribute 'next'
为什么这段代码(或者说书中的代码)在Python 3.2中不起作用?看起来应该是一个协程,但却被当作了生成器 - 为什么?这里发生了什么?