Дэвид Бизли демонстрирует , как «получить» результаты из саксофона ContentHandler с использованием сопрограммы:
cosax.py
import xml.sax
class EventHandler(xml.sax.ContentHandler):
def __init__(self,target):
self.target = target
def startElement(self,name,attrs):
self.target.send(('start',(name,attrs._attrs)))
def characters(self,text):
self.target.send(('text',text))
def endElement(self,name):
self.target.send(('end',name))
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
# example use
if __name__ == '__main__':
@coroutine
def printer():
while True:
event = (yield)
print event
xml.sax.parse("allroutes.xml",
EventHandler(printer()))
Выше, каждый раз, когда вызывается self.target.send
, код внутри printer
запускается, начиная с event = (yield)
. event
присваивается аргументам self.target.send
, а код в printer
выполняется до достижения следующего (yield)
, что-то вроде того, как работает генератор.
В то время как генератор обычно управляется for-loop
, сопрограмма (например, printer
) управляется send
вызовами.