はい、bar
の定義は実行されますが、定義にはエラーはありません。関数が呼び出されたときに存在する限り、まだ存在しないグローバルを参照する関数を定義することは有効なPythonです。これを考慮してください:
def bar():
print x
x = 10
if __name__ == '__main__':
bar()
これはエラーにはなりません。関数が定義された時点でx
が存在していても、後でdel
を使用してそれを停止するものは何もないので、これは賢明なことです。 x
を定義する必要があるのは、bar
が定義されていないときは、bar
が呼び出されたときです(これまでの場合)。
もしあなたが示唆しているようにPythonがうまくいけば、一時的に一つの名前をNone
にバインドして両方の関数を定義するというような、奇妙なハックを起こさずに相互再帰関数を定義することは不可能です。
EDIT:はコメント欄でオルコットの質問に対するイグナシオの答えについては詳しく説明し、関数が実行される前に、はい、構文エラーがキャッチされているが、それはどちらかに定義することができます前に、彼らは実際にキャッチしています。
ファイルを読み込むとき、Pythonはファイル全体を構文解析し、一度に1つずつ実行します。構文エラーとは、ファイルに含まれているステートメントを確認できなかったため、何かを実行できないことを意味します。したがって、ファイルがロードされたときにエラーが発生します。つまり、インタプリタで直接実行したとき、またはimport
のときにエラーが発生します。
この前処理ステップは、Pythonが通常コンパイルされた言語として考えられていなくても、「コンパイル時間」として知られています。これは技術的にはバイトコード形式にコンパイルされていますが、バイトコードはソースコードステートメントを直接表現するだけなので、ほとんど興味深いものです。
出典
2012-02-21 05:10:39
Ben
答えをクリアしてください。 :-) 'bar'の定義に構文エラーが含まれていると、定義が実行されたときに構文エラーが検出されます。 – Alcott
構文エラーは実行時ではなくコンパイル時に捕捉されます。 –
@Alcott:構文エラーの質問についてもう少し詳しく説明するセクションを追加しました。 – Ben