Как сделать неизменяемые словари в Python #PyTip01

Python известен своей способностью включать батареи, в нем есть решения для любых требований к структуре данных. Словари в Python очень полезны при хранении записей в виде пар ключ/значение.
Хотя словари очень удобны, они мутабельны, то есть их значения могут быть изменены после их инициализации.

В этой небольшой заметке вы узнаете, как можно использовать MappingProxyType, чтобы сделать ваши словари неизменяемыми.

Проблема

Ниже приведен пример использования словарей в Python.

>>> person = {"id" : 735616, "first_name": "John", "last_name":"Doe"}
>>> person["id"]
735616
>>> person["first_name"] + ' ' + person["last_name"]
'John Doe'
>>> person["id"] = 000000
>>> person["id"]
0
Войти в полноэкранный режим Выйти из полноэкранного режима

В приведенном выше коде мы видим, что наша запись person была изменена, и у нас нет способа заблокировать это изменение. Здесь на помощь приходит MappingProxyType.

Решение

MappingProxyType — это обертка, доступная только для чтения, которая обеспечивает прокси для основной структуры данных. MappingProxyType не поддерживает присвоение элементов, что делает наши данные неизменяемыми.

>>> from types import MappingProxyType
>>> im_person = MappingProxyType({"id":736533, "first_name":"John", "last_name":"Doe"})
>>> im_person["id"]
736533
>>> im_person["id"] = 87
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'mappingproxy' object does not support item assignment
Вход в полноэкранный режим Выход из полноэкранного режима

В приведенном выше примере видно, что когда мы попытались изменить значение id, MappingProxyType немедленно выбросил TypeError, тем самым сделав наш словарь неизменяемым. Обратите внимание, что MappingProxyType принимает любой тип данных, а не только словари. Вы также можете использовать str и list.

Предостережение

Прежде чем использовать MappingProxyType, вы должны знать, что он предоставляет только прокси для базовой структуры данных, а это значит, что если базовые данные изменены, то MappingProxyType отразит эти изменения.

>>> im_person = MappingProxyType(person)
>>> im_person
mappingproxy({'id': 0, 'first_name': 'John', 'last_name': 'Doe'})
>>> person
{'id': 0, 'first_name': 'John', 'last_name': 'Doe'}
>>> person["id"] = 00
>>> im_person
mappingproxy({'id': 0, 'first_name': 'John', 'last_name': 'Doe'})
>>>
Вход в полноэкранный режим Выход из полноэкранного режима

Как видно из приведенного выше кода, MappingProxyType изменился, когда был изменен словарь базовых данных.

Заключение

В этой небольшой статье вы узнали о types.MappingProxyType,
они полезны, когда вы хотите убедиться, что ваши пары ключ/значение остаются неизменными. Надеюсь, вам понравилось.

Оцените статью
devanswers.ru
Добавить комментарий