2016-07-12 8 views
1

ich auf dieses Thema kam heute und ich bin mir nicht ganz sicher, warum es so funktioniert:Koroutine von Koroutine in Python aufrufen

def outside(): 
    print 'before' 
    inside() 
    print 'after' 
    yield 'World' 

def inside(): 
    print 'inside' 
    yield 'Hello' 

for n in outside(): 
    print n 

(Naive) Erwartung Ausgabe:

before 
inside 
Hello 
after 
World 

Actual Ausgabe:

before 
after 
World 

Ist es nicht möglich, eine Coroutine aus einer Coroutine heraus aufzurufen? Die Artikel, die ich über Coroutines und Yield gelesen habe, haben dieses Thema nicht näher erläutert und ich bin hier ziemlich verloren. Könnte jemand bitte etwas Licht auf dieses Verhalten werfen? Danke im Voraus!

+2

Nun, was Sie haben, gibt es zwei Generator-Funktionen nicht coroutine. – styvane

Antwort

2

Es ist absolut möglich. Wenn Sie inside() anrufen, erstellt eine Coroutine. Um das Ergebnis zu erhalten, müssen Sie die Koroutine und ergeben daraus initialisieren, wie folgt:

def outside(): 
    print 'before' 
    for i in inside(): 
     yield i 
    print 'after' 
    yield 'World' 

und das Ergebnis wäre wie erwartet:

before 
inside 
Hello 
after 
World 
+2

die 'for' Schleife in @purrogrammer Beispiel ist wichtig. Ein Generator ist ein Iterator. Sie müssen die Methode '__next __()' aufrufen, die von der 'for'-Schleife ausgeführt wird. Beachten Sie, dass Sie in Ihrem Beispiel @oschlueter Ihre Funktion 'inside' aufgerufen haben, ohne sie als Iterator aufzurufen. In der Tat wurde es nie wirklich aufgerufen. – jobou

+2

Dies ist die richtige Antwort. Vor allem, weil Sie die Idee der Co-Routinen missverstanden haben. Bei jeder yield-Anweisung gibt die Funktion dem Aufrufer die Kontrolle. Im ursprünglichen Fall gab das Inside call() der outside() - Funktion die Ausführungssteuerung zurück, die jedoch nicht explizit gedruckt wurde. Der Standardaufruf an die Datei, die der Aufrufer von outside() war, druckt Strings standardmäßig auf stdout. Deshalb ist dieser Unterschied. –

+0

Richtig, danke an alle für die Klarstellungen! – oschlueter

Verwandte Themen