Как удалить лишние отступы многострочных строк Python с тройными кавычками? - PullRequest
50 голосов
/ 11 сентября 2009

У меня есть редактор Python, в котором пользователь вводит скрипт или код, который затем помещается в основной метод за кулисами, а также имеет каждую строку с отступом. Проблема заключается в том, что если у пользователя есть многострочная строка, отступ, сделанный для всего сценария, влияет на строку, вставляя табуляцию в каждый пробел. Сценарий проблемы может быть таким простым:

"""foo
bar
foo2"""

Так что в основном методе это будет выглядеть так:

def main():
    """foo
    bar
    foo2"""

и строка теперь будет иметь дополнительную вкладку в начале каждой строки.

Ответы [ 5 ]

101 голосов
/ 11 сентября 2009

textwrap.dedent из стандартной библиотеки для автоматической отмены дурацкого отступа.

25 голосов
/ 21 ноября 2017

Из того, что я вижу, лучшим ответом здесь может быть inspect.cleandoc, который функционально делает то же, что и textwrap.dedent, но также устраняет проблемы, которые textwrap.dedent имеет с лидирующей строкой. В приведенном ниже примере показаны различия:

   >>> import textwrap
   >>> import inspect
   >>> x = """foo bar
       baz
       foobar
       foobaz
       """
   >>> inspect.cleandoc(x)
   'foo bar\nbaz\nfoobar\nfoobaz'
   >>> textwrap.dedent(x)
   'foo bar\n    baz\n    foobar\n    foobaz\n'
   >>> y = """
   ...     foo
   ...     bar
   ... """
   >>> textwrap.dedent(y)
   '\nfoo\nbar\n'
   >>> inspect.cleandoc(y)
   'foo\nbar'
16 голосов
/ 11 сентября 2009

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

def main():
    """foo
bar
foo2"""
    pass

и все будет правильно.

С другой стороны, это не читается, и Python это знает. Таким образом, если строка документа содержит пробелы в строке секунда , то это количество пробелов удаляется при использовании help() для просмотра строки документа. Таким образом, help(main) и ниже help(main2) выдают одну и ту же справочную информацию.

def main2():
    """foo
    bar
    foo2"""
    pass
1 голос
/ 11 сентября 2009

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

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

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

Подумайте, есть лучшее решение ...

0 голосов
/ 11 сентября 2009

Так что, если я правильно понял, вы берете все, что вводит пользователь, правильно делаете отступ и добавляете его к остальной части вашей программы (а затем запускаете всю эту программу).

Таким образом, после того, как вы введете пользовательский ввод в вашу программу, вы можете запустить регулярное выражение, которое в основном возвращает этот принудительный отступ. Примерно так: в трех кавычках заменить все «маркеры новой строки», за которыми следуют четыре пробела (или табуляцию), только «маркер новой строки».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...