Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pythonic way to create a long multi-line string

I have a very long query. I would like to split it in several lines in Python. A way to do it in JavaScript would be using several sentences and joining them with a + operator (I know, maybe it's not the most efficient way to do it, but I'm not really concerned about performance in this stage, just code readability). Example:

var long_string = 'some text not important. just garbage to' +                   'illustrate my example'; 

I tried doing something similar in Python, but it didn't work, so I used \ to split the long string. However, I'm not sure if this is the only/best/pythonicest way of doing it. It looks awkward. Actual code:

query = 'SELECT action.descr as "action", '\     'role.id as role_id,'\     'role.descr as role'\     'FROM '\     'public.role_action_def,'\     'public.role,'\     'public.record_def, '\     'public.action'\     'WHERE role.id = role_action_def.role_id AND'\     'record_def.id = role_action_def.def_id AND'\     'action.id = role_action_def.action_id AND'\     'role_action_def.account_id = ' + account_id + ' AND'\     'record_def.account_id=' + account_id + ' AND'\     'def_id=' + def_id 
like image 605
Pablo Mescher Avatar asked May 18 '12 22:05

Pablo Mescher


People also ask

How do you make a multiline string?

Use triple quotes to create a multiline string It is the simplest method to let a long string split into different lines. You will need to enclose it with a pair of Triple quotes, one at the start and second in the end. Anything inside the enclosing Triple quotes will become part of one multiline string.

How do you print a long line of text in Python?

In Python, a backslash ( \ ) is a line continuation character. If a backslash is placed at the end of a line, it is considered that the line is continued on the next line.


2 Answers

Are you talking about multi-line strings? Easy, use triple quotes to start and end them.

s = """ this is a very         long string if I had the         energy to type more and more ...""" 

You can use single quotes too (3 of them of course at start and end) and treat the resulting string s just like any other string.

NOTE: Just as with any string, anything between the starting and ending quotes becomes part of the string, so this example has a leading blank (as pointed out by @root45). This string will also contain both blanks and newlines.

I.e.,:

' this is a very\n        long string if I had the\n        energy to type more and more ...' 

Finally, one can also construct long lines in Python like this:

 s = ("this is a very"       "long string too"       "for sure ..."      ) 

which will not include any extra blanks or newlines (this is a deliberate example showing what the effect of skipping blanks will result in):

'this is a verylong string toofor sure ...' 

No commas required, simply place the strings to be joined together into a pair of parenthesis and be sure to account for any needed blanks and newlines.

like image 124
Levon Avatar answered Sep 21 '22 11:09

Levon


If you don't want a multiline string, but just have a long single line string, you can use parentheses. Just make sure you don't include commas between the string segments (then it will be a tuple).

query = ('SELECT   action.descr as "action", '          'role.id as role_id,'          'role.descr as role'          ' FROM '          'public.role_action_def,'          'public.role,'          'public.record_def, '          'public.action'          ' WHERE role.id = role_action_def.role_id AND'          ' record_def.id = role_action_def.def_id AND'          ' action.id = role_action_def.action_id AND'          ' role_action_def.account_id = '+account_id+' AND'          ' record_def.account_id='+account_id+' AND'          ' def_id='+def_id) 

In a SQL statement like what you're constructing, multiline strings would also be fine. But if the extra white space a multiline string would contain would be a problem, then this would be a good way to achieve what you want.

As noted in the comments, concatenating SQL queries in this way is a SQL injection security risk waiting to happen, so use your database's parameterized queries feature to prevent this. However, I'm leaving the answer as-is otherwise as it directly answers the question asked.

like image 30
Jesse Avatar answered Sep 21 '22 11:09

Jesse