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
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
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.
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. –
Es ist nicht in Python gebaut wie '__iter__'. –
Generatoren und Korutinen sind der gleiche Objekttyp in Python. – katrielalex