generator `__str__()` Methode überschreiben?
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 )
Code: Alles auswählen
def print_gen(gen): print(list(gen))
PS: Die angebotene Summe ist beachtlich.
- 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?
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?
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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.cofi hat geschrieben:Warum reicht dir das denn nicht? Was hast du damit vor?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Du könntest natürlich auch einfach folgendes machen (ungetestet):
Damit einfach deine Generatoren wrappen und schon haben die alle eine nette Repräsentation.
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
@DasIch
Das ist cool... Danke!
Das ist cool... Danke!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )