print innerhalb von __str__, Stil

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
Inkane
User
Beiträge: 4
Registriert: Sonntag 3. Juli 2011, 20:47

Hallo,

ich bin noch ziemlich neu bei Python und kenne mich deshalb bei den Konventionen (abgesehen von PEP8) noch nicht so gut aus.

Zur eigentlichen Frage: Ich habe eine Klasse mit __str__ Methode. Die __str__ Methode gibt via print() farbigen Text aus (genau genommen via cprint aus dem Package termcolor). Nachdem ich festgestellt habe, dass __str__ als return Wert einen string ausgeben sollte, habe ich noch

Code: Alles auswählen

return ""
hintendran gehängt. Dies kommt mir jedoch etwas unschön vor. Deshalb wollte ich fragen, ob print Befehle innerhalb von __str__ überhaupt valide sind und ob es vielleicht eine bessere Lösung gibt. Was mir bisher als Alternative eingefallen ist:
  • statt cprint zu verwenden alle Ausgaben stattdessen in einer Variablen speichern und diese mit return ausgeben. Nachteil: ich müsste cprint durch einen anderen Befehl ersetzen und hätte eine unnötige Variable
  • statt __str__ eine andere Methode definieren, was aber den Nachteil hätte, dass print(Objekt) nichts Sinnvolles mehr ausgibt
Bin für Ratschläge aller Art offen.

Gruß,

Inkane
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

`__str__` sollte wirklich nur einen String zurückgeben, eine Ausgabe würde ich nicht erwarten. Wenn du eine spezielle formatierte Ausgabe erzeugen willst, dann lege einfach eine entsprechende Methode in der Klasse an, welche nur dies macht und rufe sie dann ggf. auf. Dafür sind sie ja da ;-)

Sebastian
Das Leben ist wie ein Tennisball.
deets

__str__ ist definitiv nicht dazu gedacht, print-anweisungen auszufueheren. Sondern eine String-Repraesaentation zurueckzugeben, ohne Seiteneffekte (Ausgaben sind Seiteneffekte).

Ich wuerde auch nicht unbedingt dazu raten, die cprint-Ausgaben in __str__ zurueckzugeben. Denn sie haengen vom Terminal ab, und das ist unter Umstaenden nicht verfuegbar (Koennte ja zB in ein logfile geschrieben werden).

Mach stattdessen einfach eine extra Methode. Denn dein vermeintlicher Nachteil ist ja nicht wirklich einer - ob du nun

foo.prettyprint()

oder

print foo

sagst, wobei das print im Grunde ignoriert wird, und nur einen impliziten Methodenaufruf nach sich zieht, ist vom Aufwand egal, und definitiv klarer.
Inkane
User
Beiträge: 4
Registriert: Sonntag 3. Juli 2011, 20:47

Okay, danke, ich verwende dann eine andere Methode.
Antworten