Неизменяемый словарь в Python 3:как сделать ключи(), элементы()и значения()представления словаря неизменяемыми

Краткая версия:Каков наилучший способ переопределить dict.keys()и друзей, чтобы уберечь себя от случайного изменения моего (предположительно)неизменяемого словаря в Python 3?

В недавнем вопросе я спросил о хешировании неизменяемого словаря в Python . С тех пор я создал неизменяемый, хешируемый словарь, которым я доволен. Однако я понял, что в нем есть дыра:представления словаря , возвращаемые keys(), items()и values(), по-прежнему позволяют мне случайно изменять мой (предположительно)неизменяемый словарь.

Единственный вопрос о переполнении стека, который я смог найти о представлениях словаря, был Python создает собственное представление словаря подмножества словаря , но это, похоже, не имело большого отношения к моей проблеме, и ответы to Что такое «замороженный диктат»? кажется, что я не вникал в переопределение 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 не могут изменять dicts. В документации Python 3 я неправильно прочитал: «Они обеспечивают динамическое представление записей словаря, что означает, что при изменении словаря представление отражает эти изменения», как говорится: «при изменении представления словарь отражает эти изменения». Очевидно, это не то, что сказано в документации.

9
задан Alex.K. 21 October 2018 в 09:52
поделиться