[Python-ideas] Descouraging the implicit string concatenation
Terry Reedy
tjreedy at udel.edu
Wed Mar 14 16:09:04 EDT 2018
On 3/14/2018 8:18 AM, Facundo Batista wrote:
> Hello!
>
> What would you think about formally descouraging the following idiom?
>
> long_string = (
> "some part of the string "
> "with more words, actually is the same "
> "string that the compiler puts together")
-1
> We should write the following, instead:
>
> long_string = (
> "some part of the string " +
> "with more words, actually is the same " +
> "string that the compiler puts together")
>
> Note that there's no penalty in adding the '+' between the strings,
> those are resolved at compilation time.
Not always, as Eryk Sun discussed.
When f-strings are thrown into the mix, as when creating multi-line
messages with interpolated values, not even true in 3.7. Compare the
following:
>>> def f():
x = input('x:')
print(f'a{x}bc' 'def')
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (input)
2 LOAD_CONST 1 ('x:')
4 CALL_FUNCTION 1
6 STORE_FAST 0 (x)
3 8 LOAD_GLOBAL 1 (print)
10 LOAD_CONST 2 ('a')
12 LOAD_FAST 0 (x)
14 FORMAT_VALUE 0
16 LOAD_CONST 3 ('bcdef')
18 BUILD_STRING 3
20 CALL_FUNCTION 1
22 POP_TOP
24 LOAD_CONST 0 (None)
26 RETURN_VALUE
>>> def f():
x = input('x:')
print(f'a{x}bc' + 'def')
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (input)
2 LOAD_CONST 1 ('x:')
4 CALL_FUNCTION 1
6 STORE_FAST 0 (x)
3 8 LOAD_GLOBAL 1 (print)
10 LOAD_CONST 2 ('a')
12 LOAD_FAST 0 (x)
14 FORMAT_VALUE 0
16 LOAD_CONST 3 ('bc')
18 BUILD_STRING 3
20 LOAD_CONST 4 ('def')
22 BINARY_ADD
24 CALL_FUNCTION 1
26 POP_TOP
28 LOAD_CONST 0 (None)
30 RETURN_VALUE
The '+' prevents compile time concatenation of 'bc' and 'def' and adds a
load and binary add.
--
Terry Jan Reedy
More information about the Python-ideas
mailing list