2012-02-15 24 views
8

Jaki jest najlepszy sposób na sformatowanie dużej kropli tekstu w pythonie? Nie mam na myśli formatowania wyników, ale raczej czytelności. Próbowałem podążać za guidelines for python layout, ale nie widzę żadnych uwag, jak sformatować duży obszar tekstowy.Formatowanie dużego tekstu w Pythonie

Na przykład:

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: 
""" 

Duży blok tekstu, wygląda okropnie, a to nie jest wcięte przez 4 spacji, więc jest to trudne do odczytania.

I co chciałbym zobaczyć, to:

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: 
    """ 

ale wprowadza to spacje na początku produkcji.

Jakieś pomysły na to, jak mogę to zrobić, stosując zalecany układ dla Pythona? Chciałbym, żeby to było schludne i łatwe do odczytania.

Czy można to zrobić bez wykonywania nadruku dla każdej linii? na przykład

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" 

Powyższy sposób polega na tym, że chciałbym, aby kod pojawił się bez konieczności drukowania w każdej linii.

Odpowiedz

17

Standardowa biblioteka ma narzędzia do tego:

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

Działa doskonale Dziękuję! – Rastapopulous

1

Sąsiednie ciągi literałów są łączone automatycznie.

>>> 'x' 'y' 
'xy' 
+2

To naruszyłoby nie więcej niż 79 znaków na linii z książki stylu Pythona. – Rastapopulous

+0

To prawdopodobnie tylko wskazówka wskazująca na odpowiedź Irfy. – yak

0
print("first line\n" 
     "second line\n" 
     "first part of third line" 
     "rest of third line\n") 

zrobić to często bardzo długich ciągów.

+0

Jest to podobne do drukowania w każdej linii. Nadal muszę dodać \ n na końcu każdej linii - miałem nadzieję tego uniknąć, używając "" " – Rastapopulous

+0

* Wizualnie * to jak drukowanie na każdej linii, ale wewnętrznie, to bardziej jak pojedynczy ciąg. Wydaje mi się, że odpowiedź campos.ddc jest najlepsza dla tego, czego szukasz, ale wymaga przetwarzania posta w czasie. Ciąg znaków – Irfy

0

Można użyć ulubionego indentantion i wyjąć zaczepy potem:

def getCalendar(): 
    return ''' 
    Text here 
    Text here 
    Text here 
    Text here 
    '''.replace('\t', '') 
+1

Jeśli używasz spacji dla wcięć (zgodnie z pythoniem preferowany jest spacing doc), to nie zadziała – Rastapopulous

1

I zazwyczaj coś takiego:

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:', 
    ]) 

Umożliwia to (względnie) łatwe przegrupowanie i dodanie nowych linii.

+0

Ten kod nie działa i ma zbyt dużo interpunkcji –

+0

Woops, moje złe na nieaktywne i poprawione. Dodatkowa interpunkcja (\\) to holdover from standardy kodowania w mojej pracy, gdzie chcą, abyśmy kontynuowali linię, są zbędni w stosunku do rzeczywistego kodu – michaelfilms

+1

Dlaczego, u licha, używałbyś kontynuacji linii odwróconej, kiedy nie musiałeś! Yikes. –

Powiązane problemy