2.1.8 Indentazione

I caratteri di spaziatura (spazi e tab) all'inizio di una riga logica, vengono utilizzati per computare il livello di indentazione di questa riga; in pratica determina il raggruppamento delle istruzioni.

Come prima cosa, i tab vengono sostituiti (da sinistra a destra) da un numero di spazi variabile da uno ad 8, in modo che il numero totale di caratteri incluso la sostituzione sia un multiplo di otto (questo si intende come la regola utilizzata dai sistemi Unix). Il numero totale di spazi che precedono il primo carattere che non sia di spaziatura determinano quindi l'indentazione della riga. L'indentazione non può essere divisa su più righe fisiche utilizzando i backslash; gli spazi fino al primo backslash determinano il livello di indentazione.

Note di compatibilità su diverse piattaforme: a causa della natura degli editor di testo sui sistemi non Unix, non è consigliato utilizzare un misto di spazi e tab per indentare una singola riga di codice sorgente. Si deve anche notare che differenti piattaforme possono limitare il numero massimo di livelli di indentazione.

Un carattere di avanzamento di pagina può essere presente all'inizio di una riga; verrà ignorato per il calcolo dell'indentazione. Caratteri di avanzamento di pagina che occorrano altrove avranno un effetto non specificato (per esempio, possono azzerare il contatore degli spazi).

Livelli di indentazione di righe consecutive vengono utilizzati per generare i token INDENT e DEDENT, utilizzando uno stack, come di seguito.

Prima che venga letta la prima riga del file, un singolo zero viene messo sullo stack; questo non verrà mai rimosso. Il numero messo nello stack sarà sempre strettamente crescente, dal fondo alla cima. All'inizio di ogni riga logica, il livello di indentazione della riga viene confrontato con la cima dello stack. Se uguale non accade niente. Se è maggiore, viene messo nello stack e viene generato un token INDENT. Se minore, deve essere uno dei numeri presenti nello stack; tutti i numeri maggiori vengono eliminati dallo stack e, per ognuno di questi, viene generato un token DEDENT. Alla fine del file viene generato un token DEDENT per ogni numero rimasto nello stack che sia maggiore di zero.

Ecco un esempio di una porzione di codice python correttamente indentato, anche se fuorviante:

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

L'esempio seguente mostra vari errori di indentazione:

 def perm(l):                       # errore: prima linea indentata
for i in range(len(l)):             # errore: non indentato
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # errore: indentazione inaspettata
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # errore: deindentazione inconsistente

In verità, i primi tre errori vengono intercettati dal parser; solo l'ultimo viene intercettato dall'analizzatore lessicale -- l'indentazione di return r non corrisponde ad un livello estratto dallo stack.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.