Building a multiline string

L

lallous

Hello

Maybe that's already documented, but it seems the parser accepts to
build a long string w/o really using the first method:

# Method1
x = "line1" + \ # cannot use comments!
"line2"+ \
"line3"

and instead using a list with one element like this:

# Method2
x = [
"line1" # can use comments
"line2"
"line3"
][0]

Or:
# Method3
x = (
"line1" # can use comments
"line2"
"line3"
)

(Not that I don't want new lines in the strings)

Now should I be using method 2 or 3 in production code?
 
U

Ulrich Eckhardt

Just for the record: Neither of the below methods actually produce a
multiline string. They only spread a string containing one line over
multiple lines of source code.
Maybe that's already documented, but it seems the parser accepts to
build a long string w/o really using the first method:

# Method1
x = "line1" + \ # cannot use comments!
"line2"+ \
"line3"

Well, obviously you can't use comments like that there. The point of the
backslash is that it continues the current logical line over the
_immediately_ _following_ newline. If anything follows, that obviously
doesn't work.
and instead using a list with one element like this:

# Method2
x = [
"line1" # can use comments
"line2"
"line3"
][0]

This basically makes use of the fact that "this" "is" "one" "string" and not
four strings.
# Method3
x = (
"line1" # can use comments
"line2"
"line3"
)

This uses the same, only that this time it uses brackets which cause an
expression to extend to multiple lines.
(Not that I don't want new lines in the strings)

You don't not want or you don't want newlines? Depending on that, you could
also do this:

# method 4
x = "line1"\
"line2"\
"line3"

or maybe

# method 5
x = """line1
line2
line3
"""

Now should I be using method 2 or 3 in production code?

I'd go for 3 or 4. 2 is basically a hack (you could do the same with a
dictionary, or a tuple, not only a list). 1 will actually create strings
and then concatenate them (unless Python is smart enough to optimize that),
but it allows adding expressions in the middle.

Uli
 
S

Steve Holden

lallous said:
Hello

Maybe that's already documented, but it seems the parser accepts to
build a long string w/o really using the first method:

# Method1
x = "line1" + \ # cannot use comments!
"line2"+ \
"line3"

and instead using a list with one element like this:

# Method2
x = [
"line1" # can use comments
"line2"
"line3"
][0]

Or:
# Method3
x = (
"line1" # can use comments
"line2"
"line3"
)

(Not that I don't want new lines in the strings)

Now should I be using method 2 or 3 in production code?
I should have thought it was pretty obvious that method 2 creates a list
and then performs an indexing operation on it. These are completely
unnecessary operations, which are avoided in method 3 which is a simple
parenthesised expression.

So why anyone would want to adopt method 2, which is also mess clear as
source code, is beyond me.

regards
Steve
 
M

Marco Mariani

Now should I be using method 2 or 3 in production code?

Another way... depending on what you are using the string for, of
course. If it's an HTML/XML/SQL/whatever piece of code:
... SELECT *
... FROM table
... WHERE foo=bar
... """)

SELECT *
FROM table
WHERE foo=bar


And if you don't want the starting/ending newlines:
... SELECT *
... FROM table
... WHERE foo=bar\
... """)
SELECT *
FROM table
WHERE foo=bar

I use this sometimes to keep both python and the embedded code readable
while preserving indentation.
 
L

lallous

@Ulrich:

Just for the record: Neither of the below methods actually produce a
multiline string. They only spread a string containing one line over
multiple lines of source code.

I meant:
"Note" -> "Note: I don't want to use new lines"

I did not want a multi line string


Thanks guys, method 3 seems to be good enough.
 
A

Aahz

x = (
"line1" # can use comments
"line2"
"line3"
)

You should indent the second and following lines (I changed the name to
"xyz" to make clear that the following lines use a regular Python indent
rather than lining up under the open paren):

xyz = (
"line1" # can use comments
"line2"
"line3"
)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,565
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top