confused about __str__ vs. __repr__

Steve Holden steve at
Thu Dec 18 22:37:45 CET 2008

Neal Becker wrote:
> Mel wrote:
>> Neal Becker wrote:
>>> Tino Wildenhain wrote:
>>>> Neal Becker wrote:
>>>>> Reading some FAQ, I see that __str__ is "meant for human eyes".
>>>>> But it seems that:
>>>>> class X(object):
>>>>>     def __str__(self):
>>>>>         return "str"
>>>>>     def __repr__(self):
>>>>>         return "repr"
>>>>> x = X()
>>>>> d = {0 : x}
>>>>> print d
>>>>> {0: repr}
>>>>> So if __str__ is "meant for human eyes", then why isn't print using it!
>>>> it is:
>>>>  > print x
>>>> str
>>>> but dict just uses repr() for all its childs to print.
>>>> T.
>>> That makes no sense to me.  If I call 'print' on a container, why
>>> wouldn't
>>> it recursively  print on the contained objects?  Since print means call
>>> str, printing a container should recursively call str on the objects.
>> Basically because there are too many right ways to format the resulting
>> report.  Space separated?  Tab separated?  One per line?  Boxes around
>> them?  As HTML definition lists?  Creating a standard report form would
>> take a lot of work and wouldn't, finally, solve very many peoples'
>> problems.
>>         Mel.
> Thanks, but the question of how to format the container is different from how to format the primitive elements of the container.  I was suggesting that printing an element of a container should be consistent with printing the element without the container, i.e.,
> print [a]
> should be consistent with
> print a
Indeed, but that only demonstrates that you have failed to take the
point of the more perspicacious replied to your query.

Python is trying to avoid throwing away useful information. The only
people who would want to see a representation of a data structure such
as a list are programmers: if you want to show a list of values to a
regular user you format it in some required way.

Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC    

More information about the Python-list mailing list