Seite 1 von 1

generator `__str__()` Methode überschreiben?

Verfasst: Donnerstag 26. November 2015, 19:03
von mutetella
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?

Re: generator `__str__()` Methode überschreiben?

Verfasst: Donnerstag 26. November 2015, 19:28
von Üpsilon

Code: Alles auswählen

def print_gen(gen): print(list(gen))

Re: generator `__str__()` Methode überschreiben?

Verfasst: Donnerstag 26. November 2015, 19:37
von cofi
@Ü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?

Re: generator `__str__()` Methode überschreiben?

Verfasst: Donnerstag 26. November 2015, 20:56
von DasIch
Du könntest eigene Klassen verwenden die sich wie Iteratoren verhalten (oder Generatoren wenn du dies wirklich brauchst).

Re: generator `__str__()` Methode überschreiben?

Verfasst: Mittwoch 2. Dezember 2015, 09:21
von mutetella
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.

Re: generator `__str__()` Methode überschreiben?

Verfasst: Mittwoch 2. Dezember 2015, 10:48
von DasIch
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.

Re: generator `__str__()` Methode überschreiben?

Verfasst: Mittwoch 2. Dezember 2015, 11:42
von mutetella
@DasIch
Das ist cool... Danke!