__str__ vs. __repr__

Bernhard Herzog herzog at online.de
Thu Nov 4 06:27:57 EST 1999

Guido van Rossum <guido at CNRI.Reston.VA.US> writes:

> It's a separate dilemma from the other examples.  My problem here is
> that I hate to make assumptions about the character set in use.  How
> do I know that '\237' is unprintable but '\241' is a printable
> character?  How do I know that the latter is an upside-down
> exclamation point?  Should I really assume stdout is capable of
> displaying Latin-1?  Strictly, the str() function doesn't even know
> that it's output is going to stdout.  I suppose I could use isprint(),
> and then François could use the locale module in his $PYTHONSTARTUP
> file to make it do the right thing.  Is that good enough?  (I just
> tried this briefly.  It seems that somehow the locale module doesn't
> affect this?!?!
> I still think that ['a', 'b'] should be displayed like that, and not
> like [a, b].  I'm not sure what that to do about a dict of Rat()
> items, except perhaps giving up on the fiction that __repr__() should
> return something expression-like for user-defined classes...
> Any suggestions?

How about a hook function a la __import__? I.e. have a function
__format__ [1] in __builtin__ that is bound to repr by default. Whenever
Python prints the result of an expression in interactive mode, it calls
__format__ with the result as parameter and expects it to return a
string ready for printing.

If somebody want str instead they can put

import __builtin__
__builtin__.__format__ == str

in their $PYTHONSTARTUP file.

This scheme even allows for more fancy formatting like not escaping
printable chars in latin1 if the user wants it.

[1] the name __format__ is perhaps a bit too generic, but something more
descriptive like __interactive_repr__ may be a bit awkward, but then
again you don't normally call it manually.

Bernhard Herzog	  | Sketch, a drawing program for Unix
herzog at online.de  | http://www.online.de/home/sketch/

More information about the Python-list mailing list