2010-12-13 13 views
6

Escribiendo una clase, ¿cómo implementopython - ¿soporta .send() para una clase?

foo.send (item)?

__iter__ permite iterar sobre la clase como un generador, ¿y si quiero que sea una corutina?

+0

No está integrado en Python como '__iter__' David Beazley. –

+0

Los generadores y coroutines son el mismo tipo de objeto en Python. – katrielalex

Respuesta

6

Aquí es una basic example of a coroutine:

def coroutine(func): 
    def start(*args,**kwargs): 
     cr = func(*args,**kwargs) 
     cr.next() 
     return cr 
    return start 

@coroutine 
def grep(pattern): 
    print "Looking for %s" % pattern 
    while True: 
     line = (yield) 
     if pattern in line: 
      print(line) 

g = grep("python") 
# Notice how you don't need a next() call here 
g.send("Yeah, but no, but yeah, but no") 
g.send("A series of tubes") 
g.send("python generators rock!") 
# Looking for python 
# python generators rock! 

Podemos hacer una clase que contiene un co-rutina tales, y los delegados llama a su método send a la co-rutina:

class Foo(object): 
    def __init__(self,pattern): 
     self.count=1 
     self.pattern=pattern 
     self.grep=self._grep() 
    @coroutine 
    def _grep(self): 
     while True: 
      line = (yield) 
      if self.pattern in line: 
       print(self.count, line) 
       self.count+=1 
    def send(self,arg): 
     self.grep.send(arg) 

foo = Foo("python") 
foo.send("Yeah, but no, but yeah, but no") 
foo.send("A series of tubes") 
foo.send("python generators rock!") 
foo.pattern='spam' 
foo.send("Some cheese?") 
foo.send("More spam?") 

# (1, 'python generators rock!') 
# (2, 'More spam?') 

en cuenta que foo actúa como una corutina (en la medida en que tiene un método de envío), pero es una clase; puede tener atributos y métodos que pueden interactuar con la corutina.

Para obtener más información (y ejemplos maravillosos), ver de Curious Course on Coroutines and Concurrency.

+0

había leído el "curioso curso" de Beazley, y estaba tratando de implementar algo de lo que aprendí allí cuando hice esta pregunta. Gracias por mostrar el def enviar(), no estaba seguro de si ese era el enfoque para tomar o no .. –