Элегантное решение многострочной строки 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)
Как импровизировано из решения Нила, я сократил импорт регулярных выражений. Это на одну строку меньше кода!
Кроме того, создание функции повышает удобочитаемость, поскольку весь оператор печати читается как английский. "Печать однострочного итогового заявления"
Есть идея получше?