Unicode und __repr__

07/05/2009 - 10:07 von Ole Streicher | Report spam
Hallo,

ich habe folgende Klasse:

class square_shape:
def __init__(self, size):
self.size = size

def __repr__(self):
return u"\u25FB" + self.size.__repr__()

Wenn ich letzteres versuche auszuführen, erhalte ich:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u25fb' in
position 8: ordinal not in range(128)

Ich hatte (von Java kommend) angenommen, dass auch Python grundsàtzlich
Unicode für die interne Repràsentation verwendet -- aber das scheint
nicht der Fall zu sein. Oder liegt das an den Sprach- oder
Terminaleinstellungen? Ich habe

LANG=en_US.UTF-8
TERM=xterm

sodass ipython (und auch python) eigentlich über die korrekten
Einstellungen verfügen. Wie kann ich hier eine korrekte Darstellung
erreichen?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Georg Brandl
07/05/2009 - 10:41 | Warnen spam
Ole Streicher schrieb:
Hallo,

ich habe folgende Klasse:

class square_shape:
def __init__(self, size):
self.size = size

def __repr__(self):
return u"\u25FB" + self.size.__repr__()

Wenn ich letzteres versuche auszuführen, erhalte ich:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u25fb' in
position 8: ordinal not in range(128)

Ich hatte (von Java kommend) angenommen, dass auch Python grundsàtzlich
Unicode für die interne Repràsentation verwendet -- aber das scheint
nicht der Fall zu sein.



Korrekt. In Python 2.x muss __repr__ einen (Byte-)String zurückgeben.
In Python 3.x ist es ein Unicodestring. Du solltest es in 2.x generell
vermeiden, Nicht-ASCII-Zeichen in einem __repr__-String zurückzugeben,
die Konvention sieht folgendes vor:

* Falls möglich, sollte eval(repr(x)) ein gleiches Objekt zurückgeben
* Ansonsten sollte ein String in <> zurückgegeben werden, also z.B.
wie bei "<class Foo at 0xpointer>".

Georg

Ähnliche fragen