Triple quoted repr

Denis S. Otkidach ods at strana.ru
Thu Jun 3 05:23:05 EDT 2004


On Thu, 3 Jun 2004, Delaney, Timothy C (Timothy) wrote:

DTCT> >  > I need a way of writing strings or arbitrary Python
DTCT> code that will
DTCT> >  >
DTCT> >  > a) allow the strings to be read again unchanged (like
DTCT> repr)
DTCT> >  > b) write multiline strings as multiline strings
DTCT> instead of escaping
DTCT> >  > the \n's.
[...]
DTCT> Perhaps something like:
DTCT>
DTCT> s = repr("'''multi\n'line'\nstring'''")
DTCT> s = "'''%s'''" % (s[1:-1].replace('\\n',
DTCT> '\n').replace("'''",
DTCT> "\\'\\'\\'"),)
DTCT>
DTCT> which changes \n to a linefeed, \r to a carriage return,
DTCT> and ''' to an
DTCT> escaped form (in case you have a triple-quoted string with
DTCT> the same
DTCT> quote character).

This fails for some strings, e.g.:
>>> s = repr("'''multi\n'line'\nstring''")
>>> s = "'''%s'''" % (s[1:-1].replace('\\n', '\n').replace("'''", "\\'\\'\\'"),)
>>> print s
'''\'\'\'multi
'line'
string'''''
>>> eval(s)
"'''multi\n'line'\nstring"

A better solution:
>>> def trepr(s):
...     return "'''"+'\n'.join([`l+'"'`[1:-2] for l in s.split('\n')])+"'''"
...
>>> s = trepr("'''multi\n'line'\nstring''")
>>> print s
'''\'\'\'multi
\'line\'
string\'\''''
>>> eval(s)
"'''multi\n'line'\nstring''"

Or you can improve your solution to handle quotes properly at the
begining and the end of string.

-- 
Denis S. Otkidach
http://www.python.ru/      [ru]





More information about the Python-list mailing list