generator `__str__()` Methode überschreiben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Um in einem Code mit vielen Generatoren beim Debuggen einen besseren Überblick zu haben, wäre es nützlich, wenn ein ``print any_generator`` nicht nur ein '<generator object submit at 0x7f31f099b730>' ausgeben würde. Der Name der Funktion (in diesem Fall `submit`) ist halt schon ein wenig dürftig... Gibt es eine Möglichkeit, ähnlich wie das Überschreiben der `__str__()` Methode?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Code: Alles auswählen

def print_gen(gen): print(list(gen))
PS: Die angebotene Summe ist beachtlich.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@Üpsilon: Damit ist der Generator nutzlos, da verbraucht.

Nein, `__str__` ist auf Generatoren read-only. Du koenntest wohl eine Funktion schreiben, die dann den Generator zurueckgibt und _deren_ `__doc__` benutzen, aber das macht den Code reichlich umstaendlich.

Interessehalber: Warum reicht dir das denn nicht? Was hast du damit vor?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du könntest eigene Klassen verwenden die sich wie Iteratoren verhalten (oder Generatoren wenn du dies wirklich brauchst).
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

cofi hat geschrieben:Warum reicht dir das denn nicht? Was hast du damit vor?
Ich habe Klassen, die jeweils eine `submit` Methode haben, die jeweils einen Generator zurückgibt, der dann '<... submit at ...>' heißt. Die Generatoren werden in einen stack gelegt und von dort dann abgearbeitet. Jetzt wäre es halt schön gewesen, wenn ich beim Betrachten des stacks nicht nur lauter `<... submit at ...>` Elemente hätte, sondern eben sehen könnte, aus welcher Klasse der jeweilige Generator stammt.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du könntest natürlich auch einfach folgendes machen (ungetestet):

Code: Alles auswählen

class ReprGenerator:
    def __init__(self, generator, repr):
        self.generator = generator
        self.repr = repr

    def __iter__(self):
        return self

    def __next__(self):
        return next(self.generator)

    def __getattr__(self, name):
        return getattr(self, generator, name)

    def __repr__(self):
        return self.repr
Damit einfach deine Generatoren wrappen und schon haben die alle eine nette Repräsentation.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@DasIch
Das ist cool... Danke!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten