1. ホーム
  2. python

[解決済み] Python-3.2 coroutine: AttributeError: 'generator' オブジェクトは 'next' という属性を持っていません。

2022-01-30 22:45:41

質問

#!/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()

これはコルーチンですが、Python3.2はこれをジェネレータとみなしています - なぜ?なぜ?Python Essential Reference by David Beazeley pg:20を参照しています。

該当箇所を引用します。

Normally, functions operate on a single set of input arguments. However, a function can
also be written to operate as a task that processes a sequence of inputs sent to
it.This type of function is known as a coroutine and is created by using the yield 
statement as an expression (yield) as shown in this example:
 def print_matches(matchtext):
   print "Looking for", matchtext
   while True:
     line = (yield)       # Get a line of text
     if matchtext in line:
       print line

To use this function, you first call it, advance it to the first (yield), and then 
start sending data to it using send(). For example:
>>> matcher = print_matches("python")
>>> matcher.next() # Advance to the first (yield)
Looking for python
>>> matcher.send("Hello World")
>>> matcher.send("python is cool")
python is cool
>>> matcher.send("yow!")
>>> matcher.close() # Done with the matcher function call

なぜ私のコードは動かないのか - DBのコードが動くわけではないのですが...。

deathstar> python3.2 xxx   
Traceback (most recent call last):
  File "xxx", line 9, in <module>
    matcher.next() # Advance to the first (yield)
AttributeError: 'generator' object has no attribute 'next'

解決方法は?

エラーメッセージに惑わされているようですが、型に関しては、Pythonは区別していません。 .send を使用しているものには yield たとえそれが内部的に送信された値に対して何もしていなくても。

3.xでは、もはや .next メソッドが付属しています。代わりに、組み込みのフリー関数 next :

next(matcher)