__str__ vs. __repr__

Thomas A. Bryan tbryan at python.net
Sat Nov 6 03:27:10 EST 1999


Donn Cave wrote:

> repr is used
> in lots of places, like the interactive interpreter,

I think that was Tim's point.  Earlier he said:
"""For that matter, why is repr implied at an interactive prompt given 
a raw expression?  Seems that friendly strings would be more 
appropriate there."""

He wants str to be used at the interpreter since it's supposed to be 
the human readable form.  One of Guido's complaints was that then 
1 and '1' then look the same.

> On the contrary, it's str() that's intended for the machine, and 
> repr() for the human.

>From the library reference:
"""repr (object) 
    Return a string containing a printable representation of an object. 
    This is the same value yielded by conversions (reverse quotes). It 
    is sometimes useful to be able to access this operation as an 
    ordinary function. For many types, this function makes an attempt 
    to return a string that would yield an object with the same value 
    when passed to eval(). 
str (object) 
    Return a string containing a nicely printable representation 
    of an object. For strings, this returns the string itself. 
    The difference with repr(object) is that str(object) does not 
    always attempt to return a string that is acceptable to eval(); 
    its goal is to return a printable string. """

The problem is that this thread is the first time many of us have 
ever thought about the problem.  I've never noticed those two lines
in the library reference, and I haven't seen the str/repr distinction 
clearly made anywhere else.  Furthermore, since the interactive i
nterpreter *does* use repr(), many of us make __repr__ return the 
human readable form so that we can easily test our classes.

So, what I'm hearing is:
1. __str__ *should* be a human readable string
2. __repr__ *should* be a representation that can be eval'd back to the 
   original object
3. This convention is not widely known, but
3b. the interactive interpreter discourages the convention by using 
   repr to show the result of an expression

Therefore, we could switch the convention for str and repr, which breaks
things that are currently following the convention.

Or we could switch the interactive interpreter to use str to encourage 
class writers to follow the convention.  Of course, any class writers 
who intentionally switched __repr__ and __str__ to get nice interactive 
behavior will have to switch the mehtods back.

Since Tim voted for the second option, that's probably what Guido will 
decide. ;)  Either way, Guido still has to deal with non-printing 
characters, string-vs-number distinctions, and other insanity in the 
interpreter. 

who-uses-the-interpreter-anyway-<wink>-ly yours
---Tom




More information about the Python-list mailing list