[Tutor] How to break long lines?
Jim Byrnes
jf_byrnes at comcast.net
Sat Feb 23 02:22:21 CET 2013
On 02/22/2013 05:46 PM, Steven D'Aprano wrote:
> On 23/02/13 08:26, Jim Byrnes wrote:
>
>> I am cleaning up my code and have a number of sqlite3 execute
>> statements that extend far past 80 characters.
>>
>> From my reading implicit line joining with (), [] or {} seems to be
>> the preferred method, but
>>
>> cur.execute('SELECT Account FROM pwds WHERE Category=? ORDER BY
>> Account COLLATE NOCASE', cat)
>>
>> gives this error:
> [...]
>> SyntaxError: EOL while scanning string literal
>
>
> Single quote strings are limited to a single line, regardless of any
> brackets (round, square or curly) around them. In this case, the
> round brackets simply allow the arguments to cur.execute() to extend
> over multiple lines, but each argument still has to obey the syntax
> rules.
>
> You can't expect this to work:
>
> func(12345 67890) # ten digit number
>
> just because of the parentheses. Neither do single-quote strings
> suddenly gain the power to extend past the end of line.
>
>
> But what you can do is use a line continuation \ as you have seen. Or
> you can use a little-known feature of Python, implicit string
> concatenation. The Python compiler will automatically concatenate
> strings at compile-time:
>
> s = "spam " 'ham ' 'eggs'
>
> is a more-verbose way of writing:
>
> s = "spam ham eggs"
>
> Now obviously this example here is useless, but when combined with
> parentheses, you get a powerful way of writing long strings:
>
>
> cur.execute('SELECT Account FROM pwds' ' WHERE Category=?' ' ORDER BY
> Account' ' COLLATE NOCASE', cat)
>
>
> which I think is really nice to read. The best part is, because
> these are string literals, the language promises to concatenate them
> at compile-time, not runtime.
>
> If implicit concatenation is too magical for you, you can use
> explicit concatenation:
>
> cur.execute('SELECT Account FROM pwds' + ' WHERE Category=?' + '
> ORDER BY Account' + ' COLLATE NOCASE', cat)
>
> At worst, the string concatenation + operator will apply at runtime,
> which for a short string like this is not a big deal. But in
> practice, I would expect Python's "keyhole optimizer" to see that it
> is only string literals being concatenated, and perform
> constant-folding at compile-time.
>
> (Note: constant-folding is not a promise of the language. Not all
> Python versions or implementations will do this.)
>
>
> A fourth option is to use triple-quoted strings:
>
> cur.execute('''SELECT Account FROM pwds WHERE Category=? ORDER BY
> Account COLLATE NOCASE''', cat)
>
>
> but this relies on your SQL database being happy to receive commands
> with embedded newlines, which it may not be.
Thanks for giving me so many options to use in the future. When reading
I completely blew by the single quote on a single line part. The db is
sqlite3 and it seems happy with ''' strings.
Thanks, Jim
More information about the Tutor
mailing list