python 3.3 repr
Ned Batchelder
ned at nedbatchelder.com
Fri Nov 15 06:38:12 EST 2013
On Friday, November 15, 2013 6:28:15 AM UTC-5, Robin Becker wrote:
> I'm trying to understand what's going on with this simple program
>
> if __name__=='__main__':
> print("repr=%s" % repr(u'\xc1'))
> print("%%r=%r" % u'\xc1')
>
> On my windows XP box this fails miserably if run directly at a terminal
>
> C:\tmp> \Python33\python.exe bang.py
> Traceback (most recent call last):
> File "bang.py", line 2, in <module>
> print("repr=%s" % repr(u'\xc1'))
> File "C:\Python33\lib\encodings\cp437.py", line 19, in encode
> return codecs.charmap_encode(input,self.errors,encoding_map)[0]
> UnicodeEncodeError: 'charmap' codec can't encode character '\xc1' in position 6:
> character maps to <undefined>
>
> If I run the program redirected into a file then no error occurs and the the
> result looks like this
>
> C:\tmp>cat fff
> repr='┴'
> %r='┴'
>
> and if I run it into a pipe it works as though into a file.
>
> It seems that repr thinks it can render u'\xc1' directly which is a problem
> since print then seems to want to convert that to cp437 if directed into a terminal.
>
> I find the idea that print knows what it's printing to a bit dangerous, but it's
> the repr behaviour that strikes me as bad.
>
> What is responsible for defining the repr function's 'printable' so that repr
> would give me say an Ascii rendering?
> -confused-ly yrs-
> Robin Becker
In Python3, repr() will return a Unicode string, and will preserve existing Unicode characters in its arguments. This has been controversial. To get the Python 2 behavior of a pure-ascii representation, there is the new builtin ascii(), and a corresponding %a format string.
--Ned.
More information about the Python-list
mailing list