123 lines
3.1 KiB
Plaintext
123 lines
3.1 KiB
Plaintext
|
PEP: 295
|
|||
|
Title: Interpretation of multiline string constants
|
|||
|
Version: $Revision$
|
|||
|
Last-Modified: $Date$
|
|||
|
Author: yozh@mx1.ru (Stepan Koltsov)
|
|||
|
Status: Draft
|
|||
|
Type: Standards Track
|
|||
|
Created: 22-Jul-2002
|
|||
|
Python-Version: 3.0
|
|||
|
Post-History:
|
|||
|
|
|||
|
Abstract
|
|||
|
|
|||
|
This PEP describes an interpretation of multiline string constants
|
|||
|
for Python. It suggests stripping spaces after newlines and
|
|||
|
stripping a newline if it is first character after an opening
|
|||
|
quotation.
|
|||
|
|
|||
|
|
|||
|
Rationale
|
|||
|
|
|||
|
This PEP proposes an interpretation of multiline string constants
|
|||
|
in Python. Currently, the value of string constant is all the
|
|||
|
text between quotations, maybe with escape sequences substituted,
|
|||
|
e.g.:
|
|||
|
|
|||
|
def f():
|
|||
|
"""
|
|||
|
la-la-la
|
|||
|
limona, banana
|
|||
|
"""
|
|||
|
|
|||
|
def g():
|
|||
|
return "This is \
|
|||
|
string"
|
|||
|
|
|||
|
print repr(f.__doc__)
|
|||
|
print repr(g())
|
|||
|
|
|||
|
prints:
|
|||
|
|
|||
|
'\n\tla-la-la\n\tlimona, banana\n\t'
|
|||
|
'This is \tstring'
|
|||
|
|
|||
|
This PEP suggest two things
|
|||
|
|
|||
|
- ignore the first character after opening quotation, if it is
|
|||
|
newline
|
|||
|
- second: ignore in string constants all spaces and tabs up to
|
|||
|
first non-whitespace character, but no more then current
|
|||
|
indentation.
|
|||
|
|
|||
|
After applying this, previous program will print:
|
|||
|
|
|||
|
'la-la-la\nlimona, banana\n'
|
|||
|
'This is string'
|
|||
|
|
|||
|
To get this result, previous programs could be rewritten for
|
|||
|
current Python as (note, this gives the same result with new
|
|||
|
strings meaning):
|
|||
|
|
|||
|
def f():
|
|||
|
"""\
|
|||
|
la-la-la
|
|||
|
limona, banana
|
|||
|
"""
|
|||
|
|
|||
|
def g():
|
|||
|
"This is \
|
|||
|
string"
|
|||
|
|
|||
|
Or stripping can be done with library routines at runtime (as
|
|||
|
pydoc does), but this decreases program readability.
|
|||
|
|
|||
|
|
|||
|
Implementation
|
|||
|
|
|||
|
I'll say nothing about CPython, Jython or Python.NET.
|
|||
|
|
|||
|
In original Python, there is no info about the current indentation
|
|||
|
(in spaces) at compile time, so space and tab stripping should be
|
|||
|
done at parse time. Currently no flags can be passed to the
|
|||
|
parser in program text (like from __future__ import xxx). I
|
|||
|
suggest enabling or disabling of this feature at Python compile
|
|||
|
time depending of CPP flag Py_PARSE_MULTILINE_STRINGS.
|
|||
|
|
|||
|
|
|||
|
Alternatives
|
|||
|
|
|||
|
New interpretation of string constants can be implemented with flags
|
|||
|
'i' and 'o' to string constants, like
|
|||
|
|
|||
|
i"""
|
|||
|
SELECT * FROM car
|
|||
|
WHERE model = 'i525'
|
|||
|
""" is in new style,
|
|||
|
|
|||
|
o"""SELECT * FROM employee
|
|||
|
WHERE birth < 1982
|
|||
|
""" is in old style, and
|
|||
|
|
|||
|
"""
|
|||
|
SELECT employee.name, car.name, car.price FROM employee, car
|
|||
|
WHERE employee.salary * 36 > car.price
|
|||
|
""" is in new style after Python-x.y.z and in old style otherwise.
|
|||
|
|
|||
|
Also this feature can be disabled if string is raw, i.e. if flag 'r'
|
|||
|
specified.
|
|||
|
|
|||
|
|
|||
|
Copyright
|
|||
|
|
|||
|
This document has been placed in the Public Domain.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Local Variables:
|
|||
|
mode: indented-text
|
|||
|
indent-tabs-mode: nil
|
|||
|
sentence-end-double-space: t
|
|||
|
fill-column: 70
|
|||
|
End:
|