複合文には、他の文 (のグループ) が入ります; 複合文は、中に入っている 他の文の実行の制御に何らかのやり方で影響を及ぼします。 一般的には、複合文は複数行にまたがって書かれますが、 全部の文を一行に連ねた単純な書き方もあります。
if、while 、および for 文は、 伝統的な制御フロー構成を実現します。try は例外処理 かつ/または一連の文に対するクリーンアップコードを指定します。 関数とクラス定義もまた、構文法的には複合文です。
複合文は、一つまたはそれ以上の `節 (clause)' からなります。 一つの節は、ヘッダと `スイート (suite)' からなります。 特定の複合文を構成する節のヘッダ部分は、全て同じインデント レベルになります。各々の節ヘッダ行は一意に識別されるキーワード から始まり、コロンで終わります。スイートは、ヘッダのコロンの後ろに セミコロンで区切られた一つまたはそれ以上の単純文を並べるか、 ヘッダ行後のインデントされた文の集まりです。 後者の形式のスイートに限り、ネストされた複合文を入れることが できます; 以下の文は、else 節がどの if 節 に属するかがはっきりしないという理由から不正になります:
if test1: if test2: print x
また、このコンテキスト中では、セミコロンはコロンよりも強い結合を 表すことにも注意してください。従って、以下の例では、print は全て実行されるか、されないかのどちらかです:
if x < y < z: print x; print y; print z
まとめると、以下のようになります:
compound_stmt | ::= | if_stmt |
| while_stmt | ||
| for_stmt | ||
| try_stmt | ||
| with_stmt | ||
| funcdef | ||
| classdef | ||
suite | ::= | stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT |
statement | ::= | stmt_list NEWLINE | compound_stmt |
stmt_list | ::= | simple_stmt (";" simple_stmt)* [";"] |
文は常に NEWLINE
か、その後に
DEDENT
が続いたもので終了することに注意してください。
また、オプションの継続節は常にあるキーワード
から始まり、このキーワードから複合文を開始することはできないため、
曖昧さは存在しないことにも注意してください (Python では、
`ぶら下がり(dangling) else' 問題を、ネストされた
if 文はインデントさせること解決しています)。
以下の節における文法規則の記述方式は、明確さのために、 各節を別々の行に書くようにしています。