Wie kann ich den Initialisierungscode für eine Generatorfunktion sofort und nicht beim ersten Aufruf ausführen?

8

Ich habe eine Generatorfunktion, die ungefähr so ​​aussieht:

%Vor%

Ich möchte, dass der Initialisierungsschritt (vor der while-Schleife) ausgeführt wird, sobald die Funktion aufgerufen wird, und nicht nur, wenn der Generator zum ersten Mal verwendet wird. Was ist ein guter Weg, dies zu tun?

Ich möchte dies tun, weil der Generator in einem separaten Thread (oder Prozess oder was auch immer Multiprocessing verwendet) läuft, und ich werde die Rückkehr für eine kurze Zeit nicht verwenden, und die Initialisierung ist etwas teuer, also ich möchte, dass es die Initialisierung durchführt, während ich mich bereit mache, die Werte zu verwenden.

    
Ryan Thompson 19.04.2011, 23:41
quelle

5 Antworten

13
%Vor%     
Andrey 20.04.2011, 00:56
quelle
7

Sie können einen "vorprimierten" Iterator ziemlich einfach erstellen, indem Sie itertools.chain :

verwenden %Vor%     
ncoghlan 20.04.2011 02:58
quelle
7

Ich brauchte etwas ähnliches. Darauf bin ich gelandet. Drücken Sie die Generatorfunktion in eine innere und geben Sie den Anruf zurück.

%Vor%     
Jason A 11.11.2014 20:05
quelle
6

Ich nehme an, Sie können nach Abschluss dieser ersten Anweisung keine hinzufügen, dann in Ihrem aufrufenden Code:

%Vor%     
Steve Howard 19.04.2011 23:47
quelle
0

Für meinen Anwendungsfall habe ich eine modifizierte Version von @ncoghlan-Antwort verwendet, die jedoch in eine Factory-Funktion eingebettet wurde, um die Generierung zu dekorieren Funktion:

%Vor%

Dann dekoriere einfach die Funktion:

%Vor%

und der erste Wert wird sofort berechnet, und das Ergebnis ist transparent.

    
Tadhg McDonald-Jensen 19.04.2016 19:00
quelle