2009-04-16 6 views
31

私はPython CGIを使用します。関数が定義される前に関数を呼び出すことはできません。Pythonファイルの関数定義を独立にする

Oracle PL/SQLには、「順方向宣言」のトリックがありました。すべての関数の先頭に名前を付けるので、定義の順序は重要ではありません。

このようなトリックはPythonでもありますか?

例:ダビデは右である

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def helper_function(hf_parameter): 
    .... 

def main(): 
    do_something(my_value) 

main() 

、私の例が間違っています。 何について:

<start of cgi-script> 

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 

print_something() 

def helper_function(hf_parameter): 
    .... 

def main() 
    .... 

main() 

は、私は、スクリプトの先頭に関数を「前方宣言」することはできますか?

+0

サンプルコードは機能し、注文に依存しないので、私は質問を受け取りません。 –

+0

[Pythonでファイルの終わりに関数を宣言する]の複製があります(http://stackoverflow.com/questions/3754240/declare-function-at-end-of-file-in-python) – user

答えて

45

すべての関数は、使用する前に定義する必要があります。

ただし、実行可能コードが関数を使用する前にすべてが定義されている限り、関数は任意の順序で定義できます。

すべての宣言が互いに完全に独立しているため、「前方宣言」は必要ありません。すべての宣言がすべての実行可能コードの前に来る限り。

問題がありますか?その場合は、動作しないコードを投稿してください。


この例では、print_something()が不足しています。

ルール:すべての機能は最後を働いていますすべての文を入れて、そのため実際の作業に

を行う任意のコードの前に定義する必要があります。

+1

これはPython 3でも当てはまりますかまたはPython <= 2? –

+0

私は、関数宣言のデフォルトのパラメータは前方宣言を必要とすると思います。 'def f(x = g()):.. def g():..'は、宣言時に使用されなくてもコンパイルされません。 – mnish

+1

@mnish True、**デフォルトパラメータがコンパイル時に**評価されることをうまく示していますが、これは意図したものではないことがよくあります。代わりに 'f(x = None):...'と 'xがNoneならば:x = g()'を使います。 – j08lue

2

定義された後に関数mainを呼び出すコードスニペットがあると仮定すると、あなたの例は書かれたとおりに動作します。 Pythonがどのように解釈されるかによって、do_somethingの本体によって呼び出される関数は、do_something関数が定義されているときに定義する必要はありません。

コードの実行中にPythonが実行する手順は次のとおりです。

  1. 関数do_somethingを定義します。
  2. 関数helper_functionを定義します。
  3. 関数mainを定義します。
  4. (私の前提を前提として)メインを呼び出します。
  5. メインから、do_somethingを呼び出します。
  6. do_somethingから、helper_functionを呼び出します。

これは、helper_functionが存在することをPythonが気にする唯一の時間です。 Pythonはhelper_functionを見つけることができるようにエラーを発生させる前に、6段階までのすべての方法でPythonがそれを呼び出せるようにする必要があります。

1

"forward-function-definition"が必要な場合はありません。print_something()をメイン関数の内部に移動することはできません..

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 

def main() 
    print_something() 
    .... 

main() 

Pythonは(そのhelper_functionを気にしない)、それは(do_something機能で)3行目で使用しています後に定義されて

私はWinPDBのようなものを使用して、コードのステップをお勧めします。 (?)それはPythonのパーサ/エグゼキュータがどのように機能するかをうまく示し

16

あなたのポイントのより良い図は、次のようになります。つまり

def main(): 
    print_something() 
    .... 

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 


main() 

は、編集のために、上部にmain()のあなたの定義を維持することができます便利 - ほとんどの時間がメイン編集に費やされている場合、頻繁なスクロールを避ける。

+1

これは、一般的な 'if __name__ ==" __main __ ":'バリアによって宣言と実行されたコードを分離することに非常に意味があるのです。 – j08lue

0
def funB(d,c): 
    return funA(d,c) 

print funB(2,3) 

def funA(x,y): 
    return x+y 

上記のコードはエラーを返します。しかし、次のコードは、任意の実際の作業が行われる前に、あなたは間違いなく、あなたが明示的に機能を使用しない場合は逃げることが可能である、関数を定義しなければならないにもかかわらず、...だから

def funB(d,c): 
    return funA(d,c) 

def funA(x,y): 
    return x+y 

print funB(2,3) 

結構です。私はこれが他の言語のプロトタイプとやや似ていると思う。

関連する問題