web-dev-qa-db-ja.com

python function nesting?

ディレクトリのバックアップを作成するプログラムを書いています。

次のアプローチのどれがコード編成に適していますか?

バックアップとZipロジック用に個別のクラスを作成する-

class BackupUtil:
    def backup(self):
       None

class ZipUtil:
    def archive_dir(self):
       None

または、次のように関数のネストを使用します-

class BackupUtil:
    def backup(self):
        def archive_dir():
            None 
        None
6
Kshitiz Sharma

一般に、内部関数が小さく、それを囲んでいる関数に対してのみ有用であることを明確にしたい場合。または、関数を返す必要がある場合。後者のシナリオは、一般的に内部関数が囲んでいる関数のスコープ内の変数に依存しているため、取るに足らないものであり、それを他の場所で宣言することはオプションではありません。その場合はラムダを使用できるかもしれませんが、1つの式よりも長いものはすべて完全な関数宣言が必要になります。

実装がなければ、この場合どちらを選択するべきかを言うのは困難です。クラスにすべてを入れる必要もないことを付け加えておきます。

7
Doval

TL; DR:関数のネストの特性が必要な場合は関数のネストを使用

関数のネストの使用例(ほとんどの場合、機能的なイディオム、頭の上部から外れているため、ほぼ確実に不完全です)

  • 閉鎖
  • 関数ファクトリー(パラメーターに基づくプログラムによる関数の作成)
  • functool.partialを呼び出して関数を作成する
  • ラムダを使用して関数を作成する
  • 呼び出し時に関数を作成する必要があるその他の理由

トレードオフ:

  • 関数は強く結合されています
  • コードは常に呼び出されます(ifブロック内にある場合を除く)
  • 追加のコードの複雑さ
  • 追加の実行時コスト(潜在的に、内部関数は外部関数の呼び出しごとに再定義されるため)
  • 拡張するのがはるかに難しい
  • 内部関数の定義を内省するのがはるかに難しい
4
dietbuddha

2つを別々にしておくことは、いくつかの理由で役立ちます。

1)どちらかのクラス(特にクラスの継承)を扱う際の柔軟性が向上します。

2)2つのクラスを、相互に独立して他のコードで使用できるモジュールに変換できます。

3)2つの機能のいずれか1つのみを使用する必要がある場合、不必要に大きなクラスを作成しないようにします。

4)関数を分離しておくと、後でこれらの関数を呼び出すときにコードが読みやすくなります

何かを明確にするのに役立つことを願っています。

0
user123787