textwrap.dedent не работает, когда есть новые строки - PullRequest
0 голосов
/ 27 марта 2020

Я не понимаю, почему textwrap.dedent не работает, если переменная details содержит \n или символы новой строки, но работает, если их нет. Есть ли обходной путь, чтобы сделать эту работу?

from textwrap import dedent

log_msg = {
    'log_id': 'testid',
    'log_level': 'CRITICAL',
    'message': 'Complete export to no_cat_products.csv',
    'details': 'asdasdasdasdasdasd\n[asdasdasdasdasd\nasdasdasd\n',
    'source_application': 'testing.py',
    'timestamp': 123445657
}

message = dedent(f"""
    ID: {log_msg['log_id']}
    Log Level: {log_msg['log_level']}
    Message: {log_msg['message']}

    Details:
    {dedent(log_msg['details'])}

    Source Application: {log_msg['source_application']}
    Created: {log_msg['timestamp']}
""")

print(message)

Вывод

        ID: testid
        Log Level: CRITICAL
        Message: Complete export to no_cat_products.csv

        Details:
        asdasdasdasdasdasd
[asdasdasdasdasd
asdasdasd


        Source Application: testing.py
        Created: 123445657

Ответы [ 3 ]

1 голос
/ 27 марта 2020

textwrap.dedent удаляет отступ , общий для всех непустых строк его ввода. Он не просто полностью удаляет все отступы.

Ваша строка содержит непустые строки без отступов, поскольку log_msg['details'] имеет длину в несколько строк. Нет отступов, общих для всех непустых строк.

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

  • Если вы хотел полностью удалить все отступы, включая отступ, который был в исходной строке log_msg['details'], тогда dedent - неправильный инструмент - возможно, вам следует разбить строку на строки, lstrip каждую строку, и соединить их вместе.
  • Если вы ожидали, что все строки будут иметь одинаковые начальные отступы перед вызовом dedent, то, возможно, вам нужно построить строку по-другому.
  • Если вы хотите, чтобы ваш код вел себя так, как если бы Сама строка форматирования не имеет отступов, тогда вы должны написать строку форматирования без отступов или использовать str.format вместо f-строк и применять dedent перед форматированием .
1 голос
/ 27 марта 2020

Вы можете использовать lstrip в каждой строке, разделенной на '\n'

print('\n'.join([m.lstrip() for m in message.split('\n')]))
0 голосов
/ 27 марта 2020

Я нашел обходной путь, но я не уверен, что это лучшая практика. Это работает в любом случае.

message = dedent(f"""
    ID: {log_msg['log_id']}
    Log Level: {log_msg['log_level']}
    Message: {log_msg['message']}
""") + 'Details:\n' + log_msg['details'] + dedent(f"""
    Source Application: {log_msg['source_application']}
    Created: {log_msg['timestamp']}
""")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...