Diccionario inmutable en Python 3: cómo hacer que las vistas de los diccionarios de teclas (), elementos () y valores () sean inmutables

Versión corta: ¿Cuál es la mejor manera de anular dict.keys() y amigos para evitar que modifique accidentalmente mi (supuestamente) diccionario inmutable en Python 3?

En una pregunta reciente, pregunté sobre Hashing un diccionario inmutable en Python . Desde entonces, he creado un diccionario de hashable inmutable con el que estoy contento. Sin embargo, me di cuenta de que tiene un agujero: las vistas del diccionario devueltas por las keys() , los items() y los values() todavía me permiten mutar accidentalmente mi (supuestamente) diccionario inmutable.

La única pregunta sobre Stack Overflow que pude encontrar sobre las vistas de diccionarios fue que Python creaba una vista de dictado del subconjunto de diccionarios , pero eso no parecía tener mucho que ver con mi problema, y ​​las respuestas a ¿Qué sería un “dict congelado”? ? no parece que se metan en las keys() anulación keys() , etc.

¿Al hacer algo como esto me impediría modificar accidentalmente, por ejemplo, las claves de mi diccionario inmutable?

 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()) 

Lo que he recogido de las respuestas.

No puedo leer, principalmente.

Los dictámenes no pueden modificar los dictados. En la documentación de Python 3 , leí mal, “Proporcionan una vista dinámica en las entradas del diccionario, lo que significa que cuando el diccionario cambia, la vista refleja estos cambios” como diciendo “cuando la vista cambia, el diccionario refleja estos cambios”. Obviamente eso no es lo que dice la documentación.

En Python 2.x, las vistas no te permiten mutar tu objeto subyacente:

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

En Python 3.x, las vistas mutantes dan un TypeError:

 >>> a = { 'a':1} >>> a.keys()[0] = 'b' Traceback (most recent call last): File "", line 1, in  TypeError: 'dict_keys' object does not support item assignment 

Probablemente sea una mala idea, ya que rompe la suposición de que esos métodos devuelven vistas en primer lugar y los reemplaza por objetos mutables que ya no se actualizan para coincidir con el dict subyacente.

¿Cómo pueden tus vistas mutar tu diccionario? Las vistas no admiten la asignación o eliminación de elementos, por lo que no creo que puedan cambiar el diccionario subyacente.