2010-12-28 11 views
2

連鎖方法を停止し、代わりに連鎖をいくつかの式に分割する際のガイドラインはありますか?メソッドチェーニング - 十分なチェーンメソッドがいくつありますか?

この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つのメソッドは大丈夫ですか?表現を分割することで目に見えるメリットが得られますか?

+3

ニッチ。ビルトインを隠す 'dict'に束縛しないでください。おそらく 'word_count'に名前を変更し、関数の名前を' count_words'に変更します。あなたが連鎖する3つの方法には何の問題もありません。あなたがしていることを一目で分かります。 –

答えて

3

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

6

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

それはそれは、単一の行のための多くを取得する場合、私は

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

を好むもう一つの問題は、あなたがBarにトレースしたい場合はFooにトレースすることを強制デバッガ、することができ、書式設定のより多くの問題です。

+2

もちろん、この構文はPythonでは不正です。ドール! – robert

+0

!あなたはもちろん正しいのです。 Pythonで動作する長鎖の代替手段はありますか? (Pythonの私の唯一の経験は、ビルドスクリプトを手にして、私が多くに壊れないことを期待しています) – peterchen

+3

式全体をかっこで囲み、うまくいきます。 – Duncan

3

長いチェーンを使用しない理由の1つは、トレースバックエラーメッセージがあいまいであることです。 長鎖のどこにでも例外が発生すると、トレースバックエラーメッセージは、チェーンのどの部分ではなく、例外が発生した行だけを通知します。

あなたは例外が発生しないと確信していた場合は、メモリが文字列contents、リストwordsによって消費されるとまで解放されないため、その後

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 

に望ましいかもしれませんこのコードブロックは終了します(同じオブジェクトに対して他の参照が行われていないと仮定します)。したがって、メモリが逼迫している場合は、連鎖を考慮する必要があります。

メモリは問題ないが、特にもしwords又はcontentsはもちろんreadlower及び獲得/又はsplit方法」は速くなり、それらを参照するために、変数を割り当てる、後のコードで再度使用することができる場合もう一度呼び出さなければならない。

+0

私はメモリが問題ではないと思うのは、標準的な実装が参照数であると考えられるからです。 –

+0

ええ、スコープは変更されたときにはより厳しく、gcはオブジェクトを早くクリアすることができます。 – Falmarri

関連する問題