2010-12-13 4 views
6

Schreiben einer Klasse, wie implementiere ichPython - Unterstützung .send() für eine Klasse?

foo.send (Element)?

__iter__ ermöglicht Iteration über die Klasse wie ein Generator, was ist, wenn ich will, dass es eine Coroutine ist? Hier

+0

Es ist nicht in Python gebaut wie '__iter__'. –

+0

Generatoren und Korutinen sind der gleiche Objekttyp in Python. – katrielalex

Antwort

6

ist ein 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! 

wir eine Klasse machen, die eine solche Koroutine enthält, und die Delegierten ruft seine send Methode zum Koroutine:

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?') 

Beachten Sie, dass foo wirkt wie eine Coroutine (insofern sie eine send-Methode hat), aber eine Klasse - sie kann Attribute und Methoden haben, die mit der Coroutine interagieren können.

Weitere Informationen (und wunderbare Beispiele), siehe David Beazleys Curious Course on Coroutines and Concurrency.

+0

Ich hatte Beazleys "kuriosen Kurs" gelesen und versuchte etwas von dem, was ich dort gelernt hatte, umzusetzen, als ich diese Frage stellte. Danke, dass du den def send() angezeigt hast, ich war mir nicht sicher, ob das der Ansatz war oder nicht. –

Verwandte Themen