1. ホーム
  2. python

[解決済み] Pythonで関数を前方に宣言することは可能ですか?

2022-01-30 12:27:52

質問

Pythonで関数を前方に宣言することは可能ですか? 私は私自身のものを使用してリストを並べ替えたい cmp 関数が宣言される前に

print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])

の定義を置くようにコードを整理しました。 cmp_configs メソッドを呼び出した後です。 このエラーで失敗します。

NameError: name 'cmp_configs' is not defined

を宣言する方法はありますか? cmp_configs メソッドが使用される前に、そのメソッドが使用されますか? そうすれば、私のコードはよりきれいに見えるようになりますか?

この問題が起きないように、コードを再編成すればいいじゃないか、と言いたくなる人もいると思うんです。 しかし、例えば、ある種の再帰を実装する場合など、おそらく避けられないケースもある。 もしこの例が気に入らないのなら、私が 本当に 関数を前方に宣言する必要があります。

Pythonで関数の前方宣言が必要なケースを考えてみましょう。

def spam():
    if end_condition():
        return end_result()
    else:
        return eggs()

def eggs():
    if end_condition():
        return end_result()
    else:
        return spam()

ここで end_conditionend_result は事前に定義されています。

解決策としては、コードを再編成して、常に起動の前に定義を置くしかないのでしょうか?

どのように解決するのですか?

関数を定義したくない場合 前に が使用され、それを定義すると その後 は無理なので、他のモジュールで定義するのはどうでしょうか?

技術的にはまだ最初に定義することになりますが、クリーンです。

次のような再帰を作ることができます。

def foo():
    bar()

def bar():
    foo()

Pythonの関数は、値が匿名であるのと同じように匿名ですが、名前に束縛することができます。

上記のコードで foo() は foo という名前の関数を呼び出しているわけではなく、たまたま foo を呼び出した時点で を再定義することは可能です。 foo を他の場所で使用し bar は新しい関数を呼び出すことになります。

宣言されていない変数を取得しろというようなものですから、あなたの問題は解決できません。