Gibt es eine Möglichkeit, einen Verweis auf das zurückgegebene Generatorobjekt innerhalb der Definition des Generators zu erhalten? Dies wäre vergleichbar mit dem self
-Argument, das an die Methode innerhalb der __next__
-Methode eines Iterators übergeben wird. Nach dem Durchsuchen der Python-Dokumentation habe ich nichts Ähnliches gefunden.Gibt es etwas Ähnliches wie "self" in einem Python-Generator?
Diese Frage entstand, während ich erforschte, wie viel der Ideen des folgenden Papiers ich in Python mit Generatoren als Koroutinen implementieren kann. Papier: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.19.79
Das nächste, was ich tun konnte, war das Folgende, mit einem Dekorateur, der auf David Beazley coroutine
Dekorateur baut, aber es fühlt sich an wie ein bisschen wie ein Hack.
from functools import wraps
def coroutine(func):
@wraps(func)
def decorated(*args, **kwargs):
f = func(*args, **kwargs)
next(f)
f.send(f)
return f
return decorated
@coroutine
def A():
self = yield
# do stuff...
EDIT: Die folgende Klasse, basierend auf der Antwort unten, kann als Dekorateur verwendet werden, den Generator zu haben, einen Verweis auf self
als ersten Paramter erhalten. Es hat den zusätzlichen Vorteil, dass jeder damit ausgestattete Generator den Typ coroutine
hat.
class coroutine(object):
"""Decorator class for coroutines with a self parameter."""
def __new__(cls, func):
@wraps(func)
def decorated(*args, **kwargs):
o = object.__new__(cls)
o.__init__(func, args, kwargs)
return o
return decorated
def __init__(self, generator, args, kw):
self.generator = generator(self, *args, **kw)
next(self.generator)
def __iter__(self):
return self
def __next__(self):
return next(self.generator)
next = __next__
def send(self, value):
return self.generator.send(value)
# Usage:
@coroutine
def A(self):
while True:
message = yield
print self is message
a = A()
b = A()
a.send(a) # outputs True
a.send(b) # outputs False
Ich habe kurz über ein Drittel der Zeitung überflogen, und ich habe nichts gesehen, wofür eine Coroutine einen Verweis auf sich selbst haben sollte. Es sah so aus, als ob eine Coroutine die Coroutine bei jedem gegebenen Index auslösen sollte. Ist das genau, oder sollte ich zurückgehen und tatsächlich die Zeitung lesen anstatt zu skimmen? – user2357112
Wenn Sie möchten, dass eine Coroutine einen Verweis auf sich selbst hat, wofür würden Sie sie verwenden? Würde sich die Coroutine selbst als Callback zu einem anderen Teil des Codes ausgeben? – user2357112
können Sie einen gebrauchten Fall setzen, eigentlich bin ich nicht klar, was Sie versuchen zu tun. –