[Python-3000] PEP 3138- String representation in Python 3000
Jim Jewett
jimjjewett at gmail.com
Tue May 27 21:17:29 CEST 2008
On 5/27/08, Adam Olsen <rhamph at gmail.com> wrote:
> On Mon, May 26, 2008 at 8:13 PM, Jim Jewett <jimjjewett at gmail.com> wrote:
> > The problem is classes where str(x) != repr(x), and how they get
> > messed up when a container holding (one of their) instances is
> > printed.
> >>>> class A:
> >>>> def __str__(self): return "an A"
> >>>> a=A()
> >>>> print a # this is fine.
> > an A
> >>>> str(a) # this is OK, you have asked for "%s" % a
> > 'an A'
> >>>> repr(a) # this is OK, you wanted repr explicitly.
> > '<__main__.A instance at 0x012DDAF8>'
> >>>> print ([a]) # this stinks ...
> > [<__main__.A instance at 0x012DDAF8>]
> > It would be much better as:
> >>>> print ([a]) # after fixing the recursion bug
> > ['an a']
> Hmm, I see where the confusion is. Containers only define __repr__,
> so although you think it's the list.__str__ that's mistakenly using
> repr(), it's str(list) itself that's calling repr(list).
Exactly.
And the fact that it then calls repr (rather than str) on the contents
-- even though the user asked for str -- is what I (but not Nick)
consider a bug. I believe this bug is also the only real source of
the pain that motivates PEP 3138.
> So the question to ask is whether we can define a useful __str__ for
> containers. str(['an a']) -> '[an a]' is not too bad, but
> str(['hello, world']) -> '[hello, world]' is ambiguous. It crosses
> the line into garbage.
I would consider '["hello, world"]' to be perfectly acceptable; the
conversion to str was explicit.
But to be honest, I would also accept '[hello, world]' despite the
ambiguity -- if ambiguity is a problem, then str probably isn't the
right function. (Admittedly, that does increase the pressure for a
3rd case in between; I'm just not sure that there would be enough need
for that in-between, if str worked "all the way down".)
> Along the way I've found a new definition of repr: unambiguous when
> used in a container's repr.
err ... actually even that isn't met, if you look too hard at corner
(or malicious) cases. But I agree that it is a good goal -- which
need not apply to a containers __str__.
-jJ
More information about the Python-3000
mailing list