Элегантное решение многострочной строки Python?

Я пытался записать завершение запланированного события, которое я настроил для запуска на Django. Я изо всех сил старался, чтобы мой код выглядел презентабельно, поэтому вместо помещения строки в одну строку я использовал многострочную строку для вывода на регистратор в методе класса Command Management. Пример в виде кода:

# the usual imports...
# ....
import textwrap

logger = logging.getLogger(__name__)

class Command(BaseCommand):
    def handle(self, *args, **kwargs):
        # some codes here
        # ....
        final_statement = f'''\
                           this is the final statements \
                           with multiline string to have \
                           a neater code.'''

        dedented_text = textwrap.dedent(final_statment)
        logger.info(dedent.replace('  ',''))

Я попробовал несколько методов, которые нашел, однако, самые быстрые и легкие методы все еще оставляли большой кусок пространства на терминале. Как показано здесь:

this is the final statement            with multiline string to have             a neater code.

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

dedent.replace('  ','')

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

this is the final statement with multiline string to have a neater code.

Это элегантное решение или я что-то пропустил в интернете?

3 ответа

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

import re
def single_line(string):
    return re.sub("\n\s+", "", string)

final_statement = single_line(f'''
                   this is the final statements 
                   with multiline string to have 
                   a neater code.''')
print(final_statement)

В качестве альтернативы, если вы хотите избежать этой конкретной проблемы (и не минимизировать накладные расходы на разработку), вы можете сохранить их в файле, таком как JSON, чтобы вы могли быстро редактировать подсказки, сохраняя при этом свой код чистым.

Проблема с ответами Нила и Вонга Сивей в том, что они не работают, если ваша многострочная строка содержит строки с большим отступом, чем другие:

my_string = """\
   this is my
   string and
          it has various
   identation
   levels"""

В приведенном выше случае вы хотите удалить отступы из двух пробелов, а не все пробелы в начале строки.

Решение ниже должно работать во всех случаях:

import re

def dedent(s):
    indent_level = None

    for m in re.finditer(r"^ +", s):
        line_indent_level = len(m.group())
        if indent_level is None or indent_level > line_indent_level:
            indent_level = line_indent_level

    if not indent_level:
        return s

    return re.sub(r"(?:^|\n) {%s}" % indent_level, "", s)

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


Если вам нужно только облегчить чтение кода, вместо этого вы можете использовать "конкатенацию" C-подобных строк:

my_string = (
  "this is my string"
  " and I write it on"
  " multiple lines"
)

print(repr(my_string))
# => "this is my string and I write it on multiple lines"

Вы также можете сделать это с помощью +s:

my_string = "this is my string" + \
            " and I write it on" + \
            " multiple lines"

Благодаря предложению Нейла я предложил более элегантное решение. Создав функцию для замены двух пробелов ни на одну.

def single_line(string):
    return string.replace('  ','')

final_statement = '''\
    this is a much neater
    final statement
    to present my code
    '''

print(single_line(final_statement)

Как импровизировано из решения Нила, я сократил импорт регулярных выражений. Это на одну строку меньше кода!

Кроме того, создание функции повышает удобочитаемость, поскольку весь оператор печати читается как английский. "Печать однострочного итогового заявления"

Есть идея получше?

Другие вопросы по тегам