14

dict.keys()短いバージョン: Python 3で(おそらく)不変の辞書を誤って変更しないようにするために、友達をオーバーライドするための最良の方法は何ですか?

最近の質問で、Pythonで不変の辞書をハッシュすることについて尋ねました。それ以来、私は満足している不変でハッシュ可能な辞書を作成しました。しかし、私はそれに穴があることに気づきました。、によって返される辞書ビューkeys()items()あり、values()それでも(おそらく)不変の辞書を誤って変更してしまう可能性があります。

辞書ビューについて私が見つけたStackOverflowに関する唯一の質問は、Pythonが辞書のサブセットの独自の辞書ビューを作成することでしたが、それは私の問題とはあまり関係がないようで、「凍結された辞書」とは何か?keys()オーバーライドなどにはならないようでした。

このようなことをすることで、たとえば、不変の辞書のキーを誤って変更することを防ぐことができますか?

class FrozenCounter(collections.Counter):
    "Model an hashable multiset as an immutable dictionary."
    # ...
    def keys(self):
        return list(super().keys())
    def values(self):
        return list(super().values())
    def items(self):
        return list(super().items())


答えから集めたもの

主に読めません。

dictviewsはdictを変更できません。Python 3のドキュメントでは、「ディクショナリのエントリに動的なビューを提供します。つまり、ディクショナリが変更されると、ビューはこれらの変更を反映します」と誤解し、「ビューが変更されると、ディクショナリはこれらの変更を反映します」と誤解しました。明らかに、それはドキュメントが言ったことではありません。

4

2 に答える 2

6

Python 2.x では、ビューで基になるオブジェクトを変更することはできません。

>>> a = { 'a' : 1 }
>>> a.keys()[0] = 'b'
>>> a
{'a': 1}
>>> a.values()[0] = 'b'
>>> a
{'a': 1}

Python 3.x では、ビューを変更すると TypeError が返されます。

>>> a = { 'a':1}
>>> a.keys()[0] = 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object does not support item assignment
于 2012-04-11T18:03:11.493 に答える
0

これらのメソッドが最初にビューを返すという仮定を破り、基になる辞書に一致するように更新されなくなった可変オブジェクトに置き換えるため、これはおそらく悪い考えです。

ビューはどのようにして辞書を変更できますか? ビューはアイテムの割り当てや削除をサポートしていないため、基になる辞書を変更できるとは思えません。

于 2012-04-11T18:01:27.093 に答える