11/12/07 05:42:26.89
>>109
基本はネストさせないで書く(Zen of Python より ネストさせなくていいならしない方がいい)
内部的には、ローカル・グローバルになる等の違いはあるけど、
ネストさせるかどうかの判断基準にするようなことではない。
それよりも、「非公開関数はネストにする」といったルールを運用すると、
「関数 B は A と D からのみ呼び出す」といった場合に、困ることになります。
## 内部関数が便利なのは、
* 引数があまりにも多くなる場合に、スコープ内の引数を省略できる。(クロージャ)
* 関数に渡されたパラメータを元に、関数を動的に生成する場合等。(e.g. デコレータ定義)
## 欠点は、とりあえず思いつく限りでは・・・
* (慣れてない人にとって)コードが読みにくくなる事。デバッグが多少面倒になる。
* インデントが深くなる。
* 再利用しにくい。
* ドキュメント・ツールで自動で文書化出来ない。(※ デコレータ定義用途では、functools.wrapsを使えば可)
* 関数の単体テストが出来ない。
> 状況: 関数Bと関数Cは、関数Aからしか呼び出されません。
こういった状況でネストする場合、大抵はクラスで置き換え可能なので、クラス A のメソッド _B, _C というようにする。
クラスにしない場合では、ネストさせずに 関数 A, _B, _C とします。( '_' プレフィクス付の命名で、内部関数と表明する。命名規則について >>2を読もう)