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
,
они полезны, когда вы хотите убедиться, что ваши пары ключ/значение остаются неизменными. Надеюсь, вам понравилось.