viewオブジェクト

jijixi's diaryより

view オブジェクト (.keys などが返すもの) は直接的には書き換え不可だが、(辞書のキーになるのに必要な) __hash__ メソッドは定義されていない。view は元となる辞書が変更されると値が変わるからだ。

なるほど。何回か読んでやっと意味が分かった。viewオブジェクトはimmutableだから普通は辞書のキーにできるはずだけど、元の辞書を書き換えるとviewオブジェクトの値が変更されるからmutable的な動作をするので、viewオブジェクトは辞書のキーにできませんよということか。ちなみにキーにできない理由は__hash__でTypeErrorを投げるから。また、immutableな理由はviewはセット的なオブジェクトということなので、addやupdateメソッドがないから。


よく考えてみると.keys()、.values()、.items()で集合を返すというのは、jijixiさんの要約の通り確かに便利。Javaすばらしい!またviewという言い方も、viewオブジェクトがデータを持っていなくて元の辞書のデータを参照しているだけという意味を考えると非常に分かりやすい用語だと思った。こういうオブジェクトの切り分け方は非常に面白いと思う。


ところで、イテレータよりもセットの方が便利な例で2回以上for文で使えるとあった。itertools.teeを使えば同様なことは可能だと思うが、iter()関数のジェネレータ版はitertools.teeを使っても恐らく実装できない。もっと手軽にイテレータをコピーできたり、一度イテレータでStopIterationを一度だして次にnext()を呼ぶと始めからまた回してくれるやり方があったりしたら便利だと思う。何でそういう方法が存在しないのだろうか?可読性が落ちるからだろうか?