Ответ 1
Вы можете разбить строку на две части:
def foo():
if conditional():
logger.info("<Conditional meaning> happened, so we're not "
"setting up the interface.")
Несколько последовательных строк внутри одного выражения автоматически объединяются в один, во время компиляции:
>>> def foo():
... if conditional():
... logger.info("<Conditional meaning> happened, so we're not "
... "setting up the interface.")
...
>>> import dis
>>> dis.dis(foo)
2 0 LOAD_GLOBAL 0 (conditional)
3 CALL_FUNCTION 0
6 POP_JUMP_IF_FALSE 25
3 9 LOAD_GLOBAL 1 (logger)
12 LOAD_ATTR 2 (info)
15 LOAD_CONST 1 ("<Conditional meaning> happened, so we're not setting up the interface.")
18 CALL_FUNCTION 1
21 POP_TOP
22 JUMP_FORWARD 0 (to 25)
>> 25 LOAD_CONST 0 (None)
28 RETURN_VALUE
Обратите внимание на LOAD_CONST
для строки 3, байт-код для функции содержит одну строку, уже конкатенированную.
Если вы хотите добавить выражение +
в выражение, создаются две отдельные константы:
>>> def foo():
... if conditional():
... logger.info("<Conditional meaning> happened, so we're not " +
... "setting up the interface.")
...
>>> dis.dis(foo)
2 0 LOAD_GLOBAL 0 (conditional)
3 CALL_FUNCTION 0
6 POP_JUMP_IF_FALSE 29
3 9 LOAD_GLOBAL 1 (logger)
12 LOAD_ATTR 2 (info)
15 LOAD_CONST 1 ("<Conditional meaning> happened, so we're not ")
4 18 LOAD_CONST 2 ('setting up the interface.')
21 BINARY_ADD
22 CALL_FUNCTION 1
25 POP_TOP
26 JUMP_FORWARD 0 (to 29)
>> 29 LOAD_CONST 0 (None)
32 RETURN_VALUE
Python выполняет свертывание двоичных операций с константами во время компиляции (поэтому +
, *
, -
и т.д.), в оптимизации подписи для байтового компилятора. Поэтому для определенных конкатенаций строк компилятор также может заменить +
конкатенацию строк констант конкатенированным результатом. См. peephole.c
, для последовательностей (включая строки) эта оптимизация применяется только в том случае, если результат ограничен 20 элементами (символами) или меньше.