3

メソッドのチェーンを停止し、代わりにチェーンをいくつかの式に分割するタイミングに関するガイドラインはありますか?

たとえば、単語をキーとして、対応するカウントを値として、辞書を構築するこのPythonコードについて考えてみます。

def build_dict(filename):
    with open(filename, 'r') as f:
        dict = defaultdict(int)

        for word in f.read().lower().split(): # too much?
            dict[word] += 1

        return dict

3つの方法を連鎖させても大丈夫ですか?式を分割することで、目立ったメリットはありますか?

4

3 に答える 3

6

2つだけをチェーンすることのポイントは何でしょうか?メソッドチェーンを実行する場合は、正しく実行してください。

それはフォーマットの問題です。1行で多くなる場合は、私が好みます。

(x.Foo()
  .Bar()
  .FooBar()
  .Barf());

もう1つの問題はデバッガーである可能性があり、トレースインするFoo場合はトレースインする必要がありますBar

于 2010-12-28T14:22:43.750 に答える
4

これは主に個人的な好みの問題ですが、fのテキストが他の場所で使用されない場合は、それで問題ありません。チェーンが実際に何を返すのかがカジュアルな読者には不明確になるポイントは、チェーンが長すぎるポイントです。分割することの唯一の利点は、中間結果を使用でき、明確になる可能性があることです。

于 2010-12-28T14:24:20.380 に答える
4

長いチェーンを使用しない理由の1つは、トレースバックエラーメッセージが不明瞭になることです。ロングチェーンのどこかで例外が発生した場合、トレースバックエラーメッセージは、チェーンのどの部分ではなく、例外が発生した行のみを通知します。

例外が発生しないと確信している場合は、

for word in f.read().lower().split():
    dict[word] += 1

に好ましいかもしれません

contents=f.read()
contents=contents.lower()
words=contents.split()
for word in words:
    d[word] += 1

contentsこれは、メモリが文字列とリストによって消費され、wordsこのコードブロックが終了するまで解放されないためです(同じオブジェクトに対して他の参照が行われていないことを前提としています)。したがって、メモリが不足している場合は、チェーンを検討することをお勧めします。

メモリに問題がない場合、特にコードの後半でwordsまたはcontentsを再度使用できる場合は、変数を割り当ててそれらを参照する方が、もちろん、メソッドやメソッドを再度呼び出す必要がないためread、より高速になります。lowersplit

于 2010-12-28T15:11:39.353 に答える