Python-3.2协程:AttributeError:'generator'对象没有'next'属性

6 浏览
0 Comments

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, in 
    matcher.next() # 推进到第一个(yield)
AttributeError: 'generator' object has no attribute 'next'

为什么这段代码(或者说书中的代码)在Python 3.2中不起作用?看起来应该是一个协程,但却被当作了生成器 - 为什么?这里发生了什么?

0