repr( open('/etc/motd', 'rt').read() )

Steven D'Aprano steve+comp.lang.python at
Tue Feb 16 01:43:41 EST 2016

On Tuesday 16 February 2016 00:05, Veek. M wrote:

> When I do at the interpreter prompt,
> repr( open('/etc/motd', 'rt').read() )

Opening and reading MOTD is a needless distraction from your actual 
question. This demonstrates the issue most simply:

# at the interactive interpreter

py> s = "text\n"
py> s  # evaluate the string s
py> repr(s)

Evaluating the string `s` in the REPL (Read-Eval-Print Loop) displays the 
repr() of the string. Contrast that to using print directly:

py> print s  # note the blank line

py> print repr(s)

So when you call print on a string, the string is printed in the most 
accurate way possible. When you call repr() on a string, it returns a new 
string containing the Python representation of a string.

So the string:


plus newline (but without the indent) has a representation in Python of:


so repr("text\n") == "'text\n'"

If you call repr() twice, you get this string:

py> print repr(repr("text\n"))

That should look familiar:

py> repr(s)

So when you evaluate a string on its own, the REPL prints the repr() of the 
string. So if you evaluate repr(s), you see repr(repr(s)) printed.

> With # 2 # read returns a string that the interpreter displays by
> calling __str__ via print so newlines are converted to \n.

No, that's incorrect. The REPL uses the repr() of the string. We can test 
this with a class that makes the difference between __str__ and __repr__ 
more obvious:

py> class C(object):
...     def __repr__(self):
...             return "the repr"
...     def __str__(self):
...             return "the str"
py> c = C()
py> print(c)
the str
py> c
the repr


More information about the Python-list mailing list