4.8 textwrap -- Involucro e riempimento del testo

Nuovo nella versione 2.3.

Il modulo textwrap fornisce due utili funzioni, wrap() e fill(), di TextWrapper, la classe che effettua tutto il lavoro, e una funzione di utilità dedent(). Se dovete solo creare un involucro (NdT: wrap) o riempire (NdT: fill) una o due stringhe, le prime due funzioni dovrebbero essere sufficienti; altrimenti, dovreste usare un'istanza di TextWrapper.

wrap( text[, width[, ...]])
Crea un involucro per il singolo paragrafo in text (una stringa) così che ogni riga sia lunga al massimo width caratteri. Restituisce una lista di righe di output, senza i caratteri di fine riga.

Gli argomenti opzionali di tipo keyword corrispondono agli attributi dell'istanza di TextWrapper, documentati più avanti. Il valore predefinito per width è 70.

fill( text[, width[, ...]])
Crea un involucro per il singolo paragrafo in text, e restituisce una singola stringa contenente il paragrafo nel nuovo formato. fill() è una scorciatoia per
"\n".join(wrap(text, ...))

In particolare, fill() accetta esattamente gli stessi argomenti di tipo keyword di wrap().

Sia wrap() che fill() lavorano creando un'istanza di TextWrapper, e chiamando un singolo metodo su di essa. Quell'istanza non viene riutilizzata, così per applicazioni che creano involucri o riempiono molte stringhe di testo, potrebbe essere più efficace creare il proprio oggetto TextWrapper.

Una funzione ulteriore di utilità, dedent(), viene fornita per rimuovere l'indentazione dalle stringhe che hanno degli spazi bianchi non desiderati alla sinistra del testo.

dedent( text)
Rimuove tutti gli spazi bianchi che possono venire uniformemente rimossi alla sinistra di ogni riga di text.

Questa viene tipicamente usata per per rendere le stringhe con il sistema della quotatura tripla, allineate con il margine sinistro dello schermo (o altro dispositivo di output), mantenendo comunque la forma indentata nel codice sorgente.

Per esempio:

def test():
    # Termina la prima riga con \ per evitare la riga vuota!
    s = '''\
    hello
      world
    '''
    print repr(s)          # stampa '    hello\n      world\n    '
    print repr(dedent(s))  # stampa 'hello\n  world\n'

class TextWrapper( ...)
Il costruttore TextWrapper accetta un numero di argomenti opzionali di tipo keyword. Ogni argomento corrisponde ad un attributo dell'istanza, cosi' per esempio
wrapper = TextWrapper(initial_indent="* ")
è equivalente a
wrapper = TextWrapper()
wrapper.initial_indent = "* "

Potete riutilizzare lo stesso oggetto TextWrapper più volte, e potete cambiare qualsiasi argomento facoltativo attraverso l'assegnazione diretta degli attributi dell'istanza tra i vari utilizzi.

Gli attributi dell'istanza di TextWrapper (e gli argomenti di tipo keyword del costruttore) sono i seguenti:

width
(valore predefinito: 70) La massima lunghezza delle righe determinate dall'involucro creato. A meno che nel testo di input non vi siano parole individuali più lunghe di width, TextWrapper garantisce che non vengano mandate in output delle righe più lunghe di width caratteri.

expand_tabs
(valore predefinito: True) Se vero, tutti i caratteri di tabulazione nel testo verranno espansi in spazi, utilizzando il metodo expand_tabs() di text.

replace_whitespace
(valore predefinito: True) Se vero, ogni carattere di spaziatura (come definito da string.whitespace) rimanente dopo l'espansione dei caratteri di tabulazione, verrà sostituito da un singolo spazio. Note: Se expand_tabs è falso e replace_whitespace è vero, ogni carattere di tabulazione verrà sostituito da un singolo spazio, che non è la stessa cosa dell'espansione delle tabulazioni.

initial_indent
(valore predefinito: '') La stringa che viene preposta alla prima riga dell'output realizzato. Viene inclusa nel conteggio della lunghezza della prima riga.

subsequent_indent
(valore predefinito: '') La stringa che viene preposta a tutte le righe dell'output realizzato, ad eccezione della prima. Viene inclusa nel conteggio della lunghezza di tutte le righe, ad eccezione della prima.

fix_sentence_endings
(valore predefinito: False) Se vero, TextWrapper tenta di riconoscere la fine delle frasi, e si assicura che le frasi vengano sempre separate da esattamente due spazi. Questo è in genere quanto si desidera per del testo in un font monospaziato. Comunque, l'algoritmo di riconoscimento è imperfetto: assume che la fine di ogni frase consista di una lettera minuscola seguita da un carattere tra ".", "!" o "?", eventualmente seguito da """ o "'", seguito da uno spazio. Un problema tipico di questo algoritmo, è che non è in grado di riconoscere la differenza tra ``Dr.'' in

[...] Dr. Frankenstein's monster [...]

e ``Spot.'' in

[...] See Spot. See Spot run [...]

Il valore predefinito di fix_sentence_endings è falso.

Poiché l'algoritmo di riconoscimento della frasi si affida a string.lowercase per la definizione di ``lettere minuscole'' e utilizza la convenzione di utilizzare due spazi dopo un punto per separare le frasi nella stessa riga, è specifico per i testi in lingua inglese.

break_long_words
(valore predefinito: True) Se vero, le parole più lunghe di width verranno spezzate per assicurare che nessuna riga sia più lunga di width. Se falso, le parole lunghe non verranno spezzate, e alcune righe potranno risultare più lunghe di width. (Le parole lunghe verranno poste in una riga a sè stante, per minimizzare la quantità eccedente rispetto a width.)

TextWrapper fornisce anche due metodi pubblici, analoghi alle funzioni di convenienza a livello di modulo:

wrap( text)
Crea un involucro per il singolo paragrafo in text (una stringa) così che ogni riga sia lunga al massimo width caratteri. Tutte le opzioni dell'involucro vengono prese dagli attributi dell'istanza di TextWrapper. Restituisce una lista di righe in output, senza i caratteri di fine riga.

fill( text)
Crea un involucro per il singolo paragrafo in text e restituisce una singola stringa contenente il paragrafo realizzato.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.