Каков правильный отступ для многострочных строк Python внутри функции?
def method():
string = """line one
line two
line three"""
или
def method():
string = """line one
line two
line three"""
или что-то другое?
В первом примере выглядит странно, что строка висит вне функции.
method.__doc__
не изменяется самим Python больше, чем любой другойstr
литерал.Ответы:
Вы, вероятно, хотите соответствовать
"""
Так как символы новой строки и пробелы включены в саму строку, вам придется постобработать ее. Если вы не хотите этого делать, и у вас есть много текста, вы можете сохранить его отдельно в текстовом файле. Если текстовый файл не подходит для вашего приложения и вы не хотите выполнять постобработку, я бы, вероятно, пошел с
Если вы хотите постобработать многострочную строку, чтобы обрезать ненужные вам части, вы должны рассмотреть
textwrap
модуль или технику постобработки строк документации, представленную в PEP 257 :источник
trim()
Функция , как указано в PEP257 реализован в стандартной библиотеке какinspect.cleandoc
.string
наtext
или что-то другое, то теперь вам нужно обновить отступ буквально для каждой строки многострочная строка только для того, чтобы она соответствовала"""
правильно. Стратегия отступов не должна усложнять будущие рефакторинг / обслуживание, и это одно из мест, где PEP действительно терпит неудачуtextwrap.dedent
Функция позволяет начать с правильным отступом в источнике , а затем лишить его из текста перед использованием.Как отмечают некоторые другие, компромисс заключается в том, что это дополнительный вызов функции для литерала; примите это во внимание при решении, где разместить эти литералы в вашем коде.
Завершающий конец
\
в литерале сообщения журнала должен гарантировать, что разрыв строки не находится в литерале; таким образом, литерал не начинается с пустой строки, а начинается со следующей полной строки.Возвращаемое значение from
textwrap.dedent
является входной строкой со всеми общими начальными пробелами, удаленными в каждой строке строки. Таким образом, вышеуказанноеlog_message
значение будет:источник
textwrap.dedent()
вызова является постоянное значение, как и его входной аргумент.def foo: return foo.x
тогда следующая строкаfoo.x = textwrap.dedent("bar")
.Используйте
inspect.cleandoc
так:Относительный отступ будет сохранен как ожидалось. Как указано ниже, если вы хотите сохранить предыдущие пустые строки, используйте
textwrap.dedent
. Однако это также сохраняет разрыв первой строки.источник
inspect.cleandoc
пор, существует с Python 2.6 , который был в 2008 году ..? Абсолютно чистый ответ, особенно потому, что он не использует стиль висячего отступа, который просто тратит ненужное количество местаОдин из вариантов, который, по-видимому, отсутствует в других ответах (упоминается только в комментариях naxa):
Это позволит правильно выравнивать, неявно соединять линии и сохранять сдвиг строк, что для меня является одной из причин, по которой я все равно хотел бы использовать многострочные строки.
Это не требует никакой постобработки, но вам нужно вручную добавить
\n
в любом месте, где вы хотите, чтобы строка заканчивалась. Либо в строке или в виде отдельной строки после. Последний легче скопировать-вставить в.источник
Еще несколько вариантов. В Ipython с включенным pylab dedent уже находится в пространстве имен. Я проверил, и это из Matplotlib. Или это может быть импортировано с:
В документации говорится, что она быстрее, чем эквивалентная textwrap, и в моих тестах на ipython она действительно в среднем в 3 раза быстрее с моими быстрыми тестами. Он также имеет то преимущество, что отбрасывает все начальные пустые строки, что позволяет вам быть гибким в том, как вы строите строку:
Использование matplotlib dedent в этих трех примерах даст тот же разумный результат. Функция dedent textwrap будет иметь начальную пустую строку в первом примере.
Очевидным недостатком является то, что textwrap находится в стандартной библиотеке, а matplotlib - внешний модуль.
Некоторые компромиссы здесь ... функции dedent делают ваш код более читабельным, когда определяются строки, но требуют обработки позже, чтобы получить строку в пригодном для использования формате. В строках документации очевидно, что вы должны использовать правильный отступ, так как большинство использований строки документации выполнят требуемую обработку.
Когда мне нужна недлинная строка в моем коде, я нахожу следующий заведомо уродливый код, где я позволяю длинной строке выпасть из вмещающего отступа. Определенно терпит неудачу на «Красивое лучше, чем некрасивое.», Но можно утверждать, что это проще и более явно, чем альтернатива dedent.
источник
Если вы хотите быстрое и простое решение и избавите себя от ввода новых строк, вместо этого вы можете выбрать список, например:
источник
я предпочитаю
или
источник
Мои два цента, выходите из конца строки, чтобы получить отступы:
источник
Я пришел сюда в поисках простой 1- строчной строки для удаления / исправления уровня выделения строки документации для печати, не делая его неопрятным , например, заставляя его «висеть вне функции» в скрипте.
Вот что я в итоге сделал:
Очевидно, что если вы делаете отступ с пробелами (например, 4), а не с клавишей табуляции, используйте что-то вроде этого:
И вам не нужно удалять первый символ, если вы хотите, чтобы строки документации выглядели так:
источник
Первый вариант - хороший, с отступом. Это в стиле Python - обеспечивает читабельность кода.
Чтобы отобразить это правильно:
источник
Это зависит от того, как вы хотите, чтобы текст отображался. Если вы хотите, чтобы все было выровнено по левому краю, то либо отформатируйте его, как в первом фрагменте, либо переберите все строки, обрезая влево все пространство.
источник
Для строк вы можете сразу после обработки строки. Для строк документации вам нужно обработать функцию. Вот решение для обоих, которое все еще читаемо.
источник
inspect.cleandoc
которые делают это правильно.У меня похожая проблема, код стал действительно нечитаемым с помощью мультилиней, я вышел с чем-то вроде
да, в начале это могло выглядеть ужасно, но встроенный синтаксис был довольно сложным, и добавление чего-либо в конце (например, \ n ") не было решением
источник
Вы можете использовать эту функцию trim_indent .
Результат:
источник