web-dev-qa-db-ja.com

Pythonでファイルの終わりに関数を宣言する

最初に完全に定義せずに関数を呼び出すことは可能ですか?これを試みると、「function_name is not defined」というエラーが表示されます。私はC++のバックグラウンドから来ているので、この問題は私を困らせます。

動作前に関数を宣言する:

def Kerma():
        return "energy / mass"    

print Kerma()

ただし、最初に定義せずに関数を呼び出そうとすると問題が発生します。

print Kerma()

def Kerma():
    return "energy / mass"

C++では、呼び出しの前にヘッダーを配置すると、関数を宣言できます。

ここに何かが足りませんか?

69
TheGentleOne

Pythonで慣用的な方法の1つは、

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __== '__main__':
    main()

これにより、最後に関数mainを呼び出し続ける限り、好きな順序でコードを書くことができます。

116

Pythonモジュール(.pyファイル)が実行されると、その中の最上位のステートメントが、表示されている順序で、上から下へ(最初から最後まで)実行されます。 tは、定義するまで何かを参照します。たとえば、次のようなエラーが生成されます。

_c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17
_

他の多くの言語とは異なり、defおよびclassステートメントは宣言型だけでなくPythonで実行できるため、aまたはbのいずれかを参照することはできません。それが起こり、それらは定義されます。これが最初の例に問題がある理由です。defステートメントが実行され、本文が処理され、結果の関数オブジェクトが関数名にバインドされる前にKerma()関数を参照しています。スクリプトのその時点では定義されていません。

C++などの言語のプログラムは、通常、実行前に前処理され、このコンパイル段階で、プログラム全体とそれが参照する_#include_ファイルが一度に読み取られて処理されます。 Pythonとは異なり、この言語は、宣言文を使用しており、使用前に関数の名前と呼び出しシーケンス(または変数の静的型)を宣言(定義されていない)できるため、コンパイラが名前に遭遇すると、チェックするのに十分な情報が得られます主に型チェックと型変換を必要とする使用方法。実際のコンテンツやコード本体がまだ定義されている必要はありません。

15
martineau

これはPythonでは不可能ですが、率直に言って、まったく必要ないことがすぐにわかるでしょう。コードを記述するPython的な方法は、プログラムをクラスと関数を定義するモジュールと、他のすべてをインポートして実行する単一の「メインモジュール」に分割することです。

シンプルなスローアウェイスクリプトについては、「実行可能部分」を最後に配置することに慣れるか、さらに良いことに、インタラクティブなPython Shell。

9
Eli Bendersky

Pythonは動的な言語であり、インタープリターは常に変数(関数など)の状態を取ります。一部のifブロックで関数を再定義して、毎回異なる方法で呼び出すこともできます。そのため、呼び出す前に定義する必要があります。

1
eumiro