Python Block Formatting - PullRequest
       6

Python Block Formatting

3 голосов
/ 01 декабря 2011

Как сделать отступ многострочной строки в контексте форматирования строки?например,

'''
<
     %s
>
''' % (paragraph)

, где абзац содержит символы новой строки.('foo \ nbar')

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

'''
<
    foo
bar
>
'''

, когда я действительно хочу это:

'''
<
    foo
    bar
>
'''

Я знаю, что мог бы сделать что-то вроде:

'''
<
%s
>
''' % (paragraph)

, но это нарушает читабельность для моих целей.

Я также понимаю, что мог бы просто написать некоторый код для отступа, кроме первой строки на 1 отступ, но на самом деле это не расширяемое решение (что, если у меня 2 отступа? или 3? и т. д.)

РЕДАКТИРОВАТЬ : Перед тем как опубликовать ответ, подумайте, как работает ваше решение скак то так:

'''
<
    %s
    <
        %s
        %s
        <
            %s
        >
    >
>
''' % (p1, p2, p3, p4)

Ответы [ 4 ]

2 голосов
/ 01 декабря 2011

Как насчет этого:

'''
<
   %s
>
''' % ("\n   ".join(paragraph.split("\n")))

Результат:

<
   foo
   bar
>

Строка, используемая в методе .join(), должна содержать тот же пробел (плюс \n в начале) как бы то ни было до %s в вашей строке.

1 голос
/ 01 декабря 2011

Хорошо, простое не подходит для ваших целей. Либо вам нужно использовать объектную модель документа и систему выравнивания с соответствующими отступами.

Или вы могли бы сделать что-то довольно хакерское, чтобы определить количество пробелов перед каждой заменой. Это довольно хрупко:

import re

def ind_sbt(text,indent='\t'):
    return text.replace('\n','\n%s' % (indent,))

def adjust_indents(fmtstr,*args):
    """Hacky, crude detection of identation level"""
    indented_substitutions = re.compile(r'\n(\s+)%s')
    return fmtstr % tuple([ ind_sbt(arg,indent=i) for (arg,i) in zip(args,indented_substitutions.findall(fmtstr))])

p1 = p2 = p3 = p4 = "foo\nbar"

print adjust_indents('''
<
    %s
    <
        %s
        %s
        <
            %s
        >
    >
>
''',p1,p2,p3,p4)

Уступая:

<
        foo
        bar
        <
                foo
                bar
                foo
                bar
                <
                        foo
                        bar
                >
        >
>
1 голос
/ 01 декабря 2011

Модуль Python textwrap - ваш друг, особенно его параметры initial_indent и subsequent_indent.

1 голос
/ 01 декабря 2011

Вы не можете ожидать, что интерпретатор Python автоматически сделает отступ для вашего paragraph. Вы хотите, чтобы переводчик возился с вашими данными? (Подсказка: НЕТ.)

Что вы можете сделать, это ввести пробелы:

'''
<
    %s
>
''' % (paragraph.replace('\n','\n    ')) # assuming 4 space soft tabs

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

...