Python Форматирование большого текста - PullRequest
8 голосов
/ 16 февраля 2012

Какой лучший способ отформатировать большой фрагмент текста в python? Я имею в виду не форматирование вывода, а скорее удобочитаемость. Я пытался следовать правилам для макета Python , но я не вижу никаких замечаний о том, как отформатировать большой фрагмент текста.

Например:

class GenerateCalendar(object):
def __init__(self):
    super( GenerateCalendar, self ).__init__()

def getCalendarHeader( self ):
    print """
BEGIN:VCALENDAR
PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN
VERSION:2.0
CALSCALE:GREGORIAN
X-WR-CALNAME;VALUE=TEXT:
X-WR-CALDESC;VALUE=TEXT:
"""

Большой блок текста выглядит ужасно и не имеет отступов в 4 пробела, поэтому его трудно читать.

Что бы я хотел увидеть:

 def getCalendarHeader( self ):
    print """
    BEGIN:VCALENDAR
    PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN
    VERSION:2.0
    CALSCALE:GREGORIAN
    X-WR-CALNAME;VALUE=TEXT:
    X-WR-CALDESC;VALUE=TEXT:
    """

но это вводит пробел в начало вывода.

Любые идеи о том, как я могу сделать это, следуя рекомендуемой схеме для Python? Я бы хотел, чтобы это было аккуратно и легко читалось.

Можно ли сделать это без печати каждой строки? например,

def getCalendarHeader( self ):
    print "BEGIN:VCALENDAR\n"
    print "PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN\n"
    print "VERSION:2.0\n"
    print "CALSCALE:GREGORIAN\n"
    print "X-WR-CALNAME;VALUE=TEXT:\n"
    print "X-WR-CALDESC;VALUE=TEXT:\n"

Выше я хотел бы, чтобы код отображался, не прибегая к печати каждой строки.

Ответы [ 4 ]

21 голосов
/ 16 февраля 2012

В стандартной библиотеке есть инструменты для этого:

import textwrap

#...

    def getCalendarHeader(self):
        print textwrap.dedent("""\
            BEGIN:VCALENDAR
            PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN
            VERSION:2.0
            CALSCALE:GREGORIAN
            X-WR-CALNAME;VALUE=TEXT:
            X-WR-CALDESC;VALUE=TEXT:
            """)
0 голосов
/ 16 февраля 2012

Я обычно делаю что-то вроде этого:

print '\n'.join([
    'BEGIN:VCALENDAR',
    'PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN',
    'VERSION:2.0',
    'CALSCALE:GREGORIAN',
    'X-WR-CALNAME;VALUE=TEXT:',
    'X-WR-CALDESC;VALUE=TEXT:',
     ])

Так как это позволяет (относительно) легко переставлять и добавлять новые строки.

0 голосов
/ 16 февраля 2012
print("first line\n"
      "second line\n"
      "first part of third line"
      "rest of third line\n")

Я делаю это часто для очень длинных струн.

0 голосов
/ 16 февраля 2012

Смежные строковые литералы объединяются автоматически.

>>> 'x' 'y'
'xy'
...