Le istruzioni composte contengono (gruppi di) altre istruzioni; influenzano o controllano in qualche modo l'esecuzione di queste altre istruzioni. In generale, le istruzioni composte durano per molte righe, sebbene in semplici forme un'istruzione composta completa possa essere contenuta in una sola riga.
Le istruzioni if, while e for implementano costrutti tradizionali di controllo di flusso. try specifici gestori per eccezioni e/o codice più pulito per un gruppo di istruzioni. Anche le funzioni e le definizioni di classe sono istruzioni composte.
Le dichiarazioni composte consistono in una o più 'clausole'. Una clausola consiste di un'intestazione e di una 'suite'. Le clausole d'intestazione di una particolare istruzione composta sono tutte allo stesso livello di indentazione. Ogni clausola d'intestazione inizia con una parola chiave identificabile univocamente e finisce con il carattere due punti. Una suite è un gruppo di istruzioni controllate da una clausola. Una suite può essere composta da una o più semplici istruzioni poste sulla stessa riga dell'intestazione, separate da un carattere due punti, seguendo i due punti dell'intestazione, o può essere composta da una o più istruzioni indentate sulle righe susseguenti. Solo l'ultima forma di composizione della suite può contenere istruzioni composte; quello che segue è illegale, principalmente perché non sarebbe chiaro a quale clausola if e seguente clausola else dovrebbe appartenere:
if test1: if test2: print x
Si noti anche che i due punti uniscono in modo più costrittivo che il punto in questo contesto, così come quello nel seguente esempio, una, tutte o nessuna delle istruzioni print stampate viene eseguita:
if x < y < z: print x; print y; print z
Riassumendo:
compound_stmt |
::= | if_stmt |
| while_stmt | ||
| for_stmt | ||
| try_stmt | ||
| funcdef | ||
| classdef | ||
suite |
::= | stmt_list NEWLINE
| NEWLINE INDENT statement+ DEDENT |
statement |
::= | stmt_list NEWLINE | compound_stmt |
stmt_list |
::= | simple_stmt (";" simple_stmt)* [";"] |
Si noti che l'istruzione finisce sempre con una
NEWLINE
seguita possibilmente da una
DEDENT
. Si noti anche che pure la
clausola facoltativa continuativa, inizia con una parola chiave che
non può avviare un'istruzione, così non vi sono ambiguità (il problema
dell'''else pendente'', risolto in Python dalla richiesta di
annidamento dell'istruzione if che è indentata).
La formattazione delle regole grammaticali nella seguente sezione mette ogni clausola in una riga separata, per chiarezza.