Отступы при использовании многострочных строк

Иногда мне нужно использовать многострочные строки, но во вложенном блоке. Это работает, но читаемость действительно плохая:

CONDITION1 = CONDITION2 = CONDITION3 = True

if CONDITION1:
    if CONDITION2:
        s = """jkljkj
dfkjslfds
sqjdlqkj"""
    elif CONDITION3:
        s = """azeazea
azeoiuaez
azeytzae
azetzae"""

С помощью:

if CONDITION1:
    if CONDITION2:
        s = """jkljkj
               dfkjslfds
               sqjdlqkj"""

(как предложено в Pythonic для создания длинной многострочной строки) не вариант, потому что строка s было бы:

jkljkj
               dfkjslfds
               sqjdlqkj

с нежелательными оставленными пробелами.

Вопрос: как использовать многострочные строки во вложенных блоках с хорошей читабельностью?

2 ответа

Решение

Оберните строку в вызове inspect.cleandoc и он будет очищать его так же, как очищаются строки документов (удаляя начальные и конечные пробелы и любые уровни общего отступа).

>>> import inspect
>>> s = """jkljkj
...        dfkjslfds
...        sqjdlqkj"""
...
>>> print(s)
jkljkj
       dfkjslfds
       sqjdlqkj
>>> s = inspect.cleandoc(s)
>>> print(s)
jkljkj
dfkjslfds
sqjdlqkj

textwrap.dedent это тоже опция, но она более уродливая, так как требует, чтобы вы не помещали текст в первую строку и явно использовали символ продолжения строки, чтобы каждая строка (не только вторая и последующие) имела одинаковый начальный отступ:

>>> print(textwrap.dedent('''\
...                       The^backslash is a pain
...                       so I don't recommend this approach
...                       '''))
The^backslash is a pain
so I don't recommend this approach

Обратите внимание, что хотя блоки кода на SO не показывают это должным образом, dedent оставил пустую последнюю строку (от постановки закрытия ''' на линии), где cleandoc удалил бы это.

Вы пытались использовать '\'. Например:

if CONDITION1:

   if CONDITION2:

       s = "jkljkj "\
           "dfkjslfds "\
           "sqjdlqkj"
Другие вопросы по тегам