Bedingte Farbausgabe (zB mit Farbe auf Konsole, ohne Farbe im Log)
Verfasst: Donnerstag 23. Juli 2020, 20:56
Hi,
ich benutze in meinen Projekten häufig farbigen Output (mit colorama) und will darauf nicht verzichten. Problem: Es gibt Situationen, in denen die gleiche Nachricht ohne die Farbcodes benötigt wird, zB beim Loggen in eine Datei, beim Beschriften von Graphen oder wenn man einem anderen Tool einen solchen Text mitgeben will, das mit Farbcodes nicht gut kann.
Hier ein Beispiel:
Konsolenausgabe:
Lese Fisch aus Urzeitmeer ein ... (2000000. Versuch)
Die sieht aus wie gewünscht, aber wenn ich das nun zB in eine Logdatei schreibe, steht da, wenn ich sie öffne (und nicht etwa auf der Konsole ausgebe):
... was ziemlich unleserlich ist. Kennt ihr für dieses Szenario eine praktikable Lösung?
Folgende Einfälle hatte ich bis jetzt:
LG
ich benutze in meinen Projekten häufig farbigen Output (mit colorama) und will darauf nicht verzichten. Problem: Es gibt Situationen, in denen die gleiche Nachricht ohne die Farbcodes benötigt wird, zB beim Loggen in eine Datei, beim Beschriften von Graphen oder wenn man einem anderen Tool einen solchen Text mitgeben will, das mit Farbcodes nicht gut kann.
Hier ein Beispiel:
Code: Alles auswählen
import colorama as col
col.init(autoreset=True)
BLUE, YELLOW, RED, TEXT = col.Fore.BLUE, col.Fore.YELLOW, col.Fore.RED, col.Style.RESET_ALL
def message(obj, filename, n=None):
s = f'Lese {BLUE}{obj}{TEXT} aus {YELLOW}{filename}{TEXT} ein ...'
if n is not None:
s += f' ({RED}{n}. Versuch{TEXT})'
return s
msgA = message('Fisch', 'Urzeitmeer', 2000000)
print(msgA)
Lese Fisch aus Urzeitmeer ein ... (2000000. Versuch)
Die sieht aus wie gewünscht, aber wenn ich das nun zB in eine Logdatei schreibe, steht da, wenn ich sie öffne (und nicht etwa auf der Konsole ausgebe):
Code: Alles auswählen
Lese [34mFisch[0m aus [33mUrzeitmeer[0m ein ... ([31m2000000. Versuch[0m)
Folgende Einfälle hatte ich bis jetzt:
- String grundsätzlich zweimal zusammensetzen, nämlich einmal mit und einmal ohne Farbcodes --> bläht Code auf, fehleranfällig wegen Dopplung
- String-Einzelteile einzeln zusammensetzen, im if-Teil mit, im else-Teil ohne Farbcodes --> bläht Code auf, unschön
- Klasse für Farbstrings, die bei str() nur plain Text zurückgibt, aber bei zB repr() oder .colored() den farbigen String. Der Konstruktor bekäme in dem Fall ein Tupel aus Strings und Objekten einer String-Subklasse, die nur dazu da ist, um Farbcodes als solche zu kennzeichnen und mittels isinstance() von normalen Strings unterscheiden zu können --> man muss vermutlich vieles nachimplementieren, wenn man die Objekte wie Strings benutzen können will (oder immer explizit str() machen)
- eine Funktion schreiben, die per regulärem Ausdruck alle Farbcodes herausfiltert --> nicht performant
LG