45

この設計上の決定の背後にある理由についての洞察はありますか? obj.save()return somethingを持っていることには利点(メソッドチェーンなど)しかなく、欠点はないように思えます。

4

3 に答える 3

70

通常、Python では、主に既存のオブジェクトに影響を与える関数がそれ自体を返さないようにすることをお勧めします。たとえばsorted(yourlist)、ソートされたリストを返しますが、yourlist.sort()リストをその場でソートし、何も返しません。

1 行で副作用のある複数の操作を実行することは (戻り値に焦点が当てられている副作用のない関数とは対照的に)、実際には良い方法ではありません。コードは行数の点でよりコンパクトになりますが、重要な副作用がチェーンの途中に埋もれている可能性があるため、読みにくくなります。メソッドチェーンを使用する場合は、チェーンの最初に副作用のない関数を使用.save()し、最後に副作用のある単一の関数を使用します。

別の言い方をすれば、メソッド チェーンでは、チェーンの先頭が入力であり、チェーンの途中で入力が変換され (ツリーを下に移動する、入力を並べ替える、文字列の大文字と小文字を変更するなど)、最後がメソッド チェーンの最後になります。 chain は、副作用を処理する機能部分です。チェーンの途中に副作用のあるメソッドを埋め込むと、メソッドチェーンが実際に何をするのかが不明確になります。

于 2012-06-07T17:33:35.143 に答える
7

これは、Greg Ward が最近 Pycon2015 で支持した、関数と手続きを混同しないという一般原則を思い出させます。すべての関数は、値を返すか、副作用を持つ必要がありますが、両方ではありません。

基本的に同じ質問dict.update() について尋ねられます。

于 2015-05-06T13:49:28.317 に答える