I was given to understand that calling print obj
would call obj.__str__()
which would in turn return a string to print to the console. Now I head a problem with Unicode where I could not print any non-ascii characters. I got the typical "ascii out of range" stuff.
While experimenting the following worked:
print obj.__str__()
print obj.__repr__()
With both functions doing exactly the same (__str__()
just returns self.__repr__()
). What did not work:
print obj
The problem occured only with using a character out of ascii range. The final solution was to to the following in __str__()
:
return self.__repr__().encode(sys.stdout.encoding)
Now it works for all parts. My question now is: Where is the difference? Why does it work now? I get if nothing worked, why this works now. But why does only the top part work, not the bottom.
OS is Windows 7 x64 with a default Windows command prompt. Also the encoding is reported to be cp850
. This is more of a general question to understand python. My problem is already solved, but I am not 100% happy, mostly because now calling str(obj)
will yield a string that is not encoded in the way I wanted it.
# -*- coding: utf-8 -*-
class Sample(object):
def __init__(self):
self.name = u"üé"
def __repr__(self):
return self.name
def __str__(self):
return self.name
obj = Sample()
print obj.__str__(), obj.__repr__(), obj
Remove the last obj
and it works. Keep it and it crashes with
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)