Wie dekoriere ich einen Generator in Python?

8

Also habe ich einen einfachen Generator definiert:

%Vor%

Grundsätzlich möchte ich es so dekorieren, dass es alle Werte zurückgibt, aber das letzte:

%Vor%

Wenn ich jetzt gen1

neu definiere %Vor%

aber wenn ich verwende:

%Vor%

Warum funktioniert mein Dekorateur nicht und wie kann ich ihn reparieren?

    
kaspersky 17.12.2012, 13:29
quelle

3 Antworten

5

Der rekursive Aufruf von gen1 hängt auch von Ihrem Dekorateur ab, also wird alles vom Dekorateur verbraucht.

Die einfachste Lösung besteht darin, den Generator nicht rekursiv zu schreiben oder die Rekursion einzukapseln:

Gekapselt:

%Vor%

Nicht rekursiv:

%Vor%     
ecatmur 17.12.2012, 13:33
quelle
0

Es funktioniert nicht aufgrund der Interaktion zwischen Dekorator und Rekursion. Da Ihr Generator rekursiv ist, beruht er auf einer bestimmten Wiederholungsbeziehung. Indem Sie einen modifizierenden Dekorator zwischen den Generator und den Untergenerator einfügen, brechen Sie diese Rekursionsbeziehung.

Solange @dec das letzte Element löscht, können Sie es nicht mit gen1() kompatibel machen, indem Sie @dec allein ändern.

Sie könnten jedoch gen1() ändern, um es mit @dec kompatibel zu machen:

%Vor%

Der Trick besteht darin, gen1() nicht-rekursiv zu machen und die gesamte Arbeit an einen anderen, undekorierten Generator zu delegieren. Letzteres kann rekursiv sein.

    
NPE 17.12.2012 13:33
quelle
0

Meine Lösung, wenn ich so etwas tun musste, war, einen Generator auf den Generator zu legen! Dies ist eigentlich die Idee eines dekorierten Anrufs. Das tust du,

%Vor%

genau für Ihr Problem (ergibt nur den letzten Wert) Ich würde etwas tun wie:

%Vor%     
user1941126 16.09.2014 12:58
quelle

Tags und Links