Подтвердить что ты не робот

Стиль для продолжения многострочных f-строк

Какие-нибудь популярные руководства стиля Python выражают предпочтение между:

x = (f'One plus one is '
     f'equal to {1+1}')

и

x = ('One plus one is '
     f'equal to {1+1}')

Имеет ли смысл опустить префикс f для строк, которые не включают интерполяцию? Должен ли он быть включен для согласованности?

4b9b3361

Ответ 1

Если вы посмотрите на сгенерированный код байта для каждого из этих двух параметров, вы увидите, что это приводит к одному и тому же набору операций:

>>> dis.dis("""f'One plus one is ' f'equal to {1+1}'""")
  1           0 LOAD_CONST               0 ('One plus one is equal to ')
              2 LOAD_CONST               1 (2)
              4 FORMAT_VALUE             0
              6 BUILD_STRING             2
              8 RETURN_VALUE
>>> dis.dis("""'One plus one is ' f'equal to {1+1}'""")
  1           0 LOAD_CONST               0 ('One plus one is equal to ')
              2 LOAD_CONST               1 (2)
              4 FORMAT_VALUE             0
              6 BUILD_STRING             2
              8 RETURN_VALUE

Итак, для Python это делает то же самое: строка конкатенируется во время компиляции, а вся строка оценивается как строка формата.

Обратите внимание, что в соответствии с PEP, f-строки фактически конкатенируются во время выполнения, чтобы убедиться, что каждое выражение формата оценивается независимо друг от друга:

Смежные f-строки и регулярные строки объединены. Регулярные строки объединяются во время компиляции, а f-строки объединяются во время выполнения.

Вот почему в следующем примере будут созданы два кода кода FORMAT_VALUE:

>>> dis.dis("""f'{2+2}' f'{3+3}'""")
  1           0 LOAD_CONST               0 (4)
              2 FORMAT_VALUE             0
              4 LOAD_CONST               1 (6)
              6 FORMAT_VALUE             0
              8 BUILD_STRING             2
             10 RETURN_VALUE

Это не повлияет на f-строки, которые фактически не содержат каких-либо заполнителей формата. Они все равно будут объединены во время компиляции:

>>> dis.dis("""f'foo' f'bar'""")
  1           0 LOAD_CONST               0 ('foobar')
              2 RETURN_VALUE

Таким образом, вы можете просто включить префикс f для постоянных строк в любом случае, и когда они не содержат выражения формата, они не будут обрабатываться как строки формата.

Итак, в вашем конкретном случае, поскольку нет функциональной разницы, и оба варианта скомпилированы в одно и то же, что оставляет это как чистый выбор стиля, который каждый должен ответить сам за себя.

Если вы смотрите на существующие руководства по стилям, скорее всего, они еще не покрывают f-строки. Но тогда вы могли бы использовать ту же директиву, что и для сырых строк, хотя лично я не ожидаю, что руководства по стилям действительно будут сильно охватывать эту область. Просто выберите то, что выглядит лучше, читаемо и что имеет для вас наибольший смысл. В конце концов, непрерывные строки на самом деле не такие общие (и у вас больше шансов иметь тройные кавычки для более длинных строк).