2016-05-10 5 views
1

Für Debug-Zwecke Ich versuche, den Inhalt dict zu protokollieren, die Unicode-Strings in es enthält:Python 2 - Logging-Objekt enthält Unicode

logging.info(str(data)) 

Wo data die folgende Struktur:

{'whatever®': 1} 

Offensichtlich explodiert beim Aufruf von str() die UnicodeEncodeError, da versucht wird, das ®-Symbol unter Verwendung des ASCII-Codecs unter der Haube in einen Bytestring zu konvertieren. nicht __unicode__ Methoden haben

Als dict Instanzen, was wäre der beste Weg, um zu erreichen, was ich versuche, meine eigene toString Funktion für diese Art von Daten zu tun, außer zu schreiben, die nie Unicode-Strings zu bytestrings konvertieren? Gibt es eine Dienstprogrammfunktion, die mir in der stdlib oder einer externen Bibliothek, die ich verwenden könnte, nicht bekannt ist?

+1

Python 2.7 zeigt keine Wörterbücher auf diese Weise an. Wie sieht es wirklich aus? Beispiel: Wenn ich an meinem UTF-8-Terminal "data = {'whatever®': 1}' 'und dann' data' eingeben, bekomme ich '{'whatever \ xc2 \ xae': 1}' was a ist In UTF-8 codierte Bytezeichenfolge. Dies kann ohne Probleme protokolliert werden. Was hast du eigentlich? –

Antwort

0

repr() Funktion, die eine mehrdeutige Textdarstellung eines Python-Objekts bietet, ist zum Testen, Debuggen nützlich und es scheint für die Protokollierung geeignet: logging.info(data) sollte so funktionieren wie es ist.

str(dict_object) sollte repr(dict_object) aufrufen, die repr() auf Schlüssel und Werte des dict ruft rekursiv, dass nicht UnicodeEncodeError Fehler auslösen sollte (das Ergebnis enthält nur druckbare ASCII-Zeichen auf Python 2).

Eine mögliche Erklärung ist, dass UnicodeEncodeError geschieht einen Unicode-Inhalt während der Anzeige (es gibt keine in der Frage gibt es eine bytestring im Beispiel, wenn Sie Python 3 oder from __future__ import unicode_literals), weil das Gebietsschema nicht konfiguriert ist (überprüfen LANG, LC_CTYPE , LC_ALL envvars) oder die Ausgabe des Skripts wird in eine Pipe, Datei umgeleitet (setzen Sie in diesem Fall PYTHONIOENCODING envvar).