Реализация неизменяемого словаря

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь реализовывать неизменяемый словарь в Python. Неизменяемый словарь - это структура данных, которая не может быть модифицирована после создания, что полезно в некоторых приложениях, где данные должны оставаться неизменными.

👀 Предварительный просмотр

d["Connection"]='kee-alive'
d["Host"]='www.labex.io'
TypeError("'ImmutableDict' objects are immutable")
TypeError("'ImmutableDict' objects are immutable")
d.get("Host")='www.labex.io'

🎯 Задачи

В этом проекте вы научитесь:

  • Как создать класс ImmutableDict, наследующийся от встроенного класса dict
  • Как реализовать методы в классе ImmutableDict, чтобы предотвратить модификацию словаря
  • Как протестировать класс ImmutableDict, чтобы убедиться, что он работает как ожидается

🏆 Достижения

После завершения этого проекта вы сможете:

  • Разобраться в концепции неизменяемых структур данных и их случаях использования
  • Реализовать неизменяемый словарь в Python с использованием класса ImmutableDict
  • Предотвратить модификацию словаря, переопределив соответствующие методы
  • Протестировать класс ImmutableDict, чтобы убедиться, что он работает как ожидается

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/DataStructuresGroup -.-> python/dictionaries("Dictionaries") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/inheritance("Inheritance") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") subgraph Lab Skills python/dictionaries -.-> lab-302737{{"Реализация неизменяемого словаря"}} python/classes_objects -.-> lab-302737{{"Реализация неизменяемого словаря"}} python/inheritance -.-> lab-302737{{"Реализация неизменяемого словаря"}} python/catching_exceptions -.-> lab-302737{{"Реализация неизменяемого словаря"}} python/raising_exceptions -.-> lab-302737{{"Реализация неизменяемого словаря"}} end

Реализация класса ImmutableDict

В этом шаге вы научитесь реализовывать класс ImmutableDict в файле immutable_dict.py. Следуйте шагам ниже, чтобы завершить этот шаг:

  1. Откройте файл immutable_dict.py, расположенный в директории /home/labex/project.
  2. Создайте новый класс под названием ImmutableDict, который наследуется от встроенного класса dict.
class ImmutableDict(dict):
  1. Реализуйте следующие методы в классе ImmutableDict, чтобы сделать словарь неизменяемым:
def __setitem__(self, key, value):
    raise TypeError("'ImmutableDict' objects are immutable")

def __delitem__(self, key):
    raise TypeError("'ImmutableDict' objects are immutable")

def pop(self, key, default=None):
    raise TypeError("'ImmutableDict' objects are immutable")

def popitem(self):
    raise TypeError("'ImmutableDict' objects are immutable")

def clear(self):
    raise TypeError("'ImmutableDict' objects are immutable")

def update(self, *args, **kwargs):
    raise TypeError("'ImmutableDict' objects are immutable")

def setdefault(self, key, default=None):
    raise TypeError("'ImmutableDict' objects are immutable")

Эти методы переопределяют соответствующие методы в классе dict и вызывают исключение TypeError при любом попытке модифицировать словарь.

  1. Сохраните файл immutable_dict.py.

Тестирование класса ImmutableDict

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

  1. Откройте файл immutable_dict.py в директории /home/labex/project.
  2. Добавьте следующий код в конец файла, чтобы протестировать класс ImmutableDict:
if __name__ == "__main__":
    d = ImmutableDict(Connection="kee-alive", Host="www.labex.io")
    print(f'{d["Connection"]=}')
    print(f'{d["Host"]=}')

    try:
        d["Host"] = "test.com"
    except TypeError as e:
        print(repr(e))

    try:
        d.pop("Host")
    except TypeError as e:
        print(repr(e))

    print(f'{d.get("Host")=}')
  1. Сохраните файл immutable_dict.py.
  2. Запустите скрипт immutable_dict.py в терминале:
python3 immutable_dict.py

Вывод должен быть таким:

d["Connection"]='kee-alive'
d["Host"]='www.labex.io'
TypeError("'ImmutableDict' objects are immutable")
TypeError("'ImmutableDict' objects are immutable")
d.get("Host")='www.labex.io'

Этот вывод показывает, что класс ImmutableDict работает как ожидается, и любые попытки модифицировать словарь вызывают исключение TypeError.

Поздравляем! Вы успешно реализовали класс ImmutableDict и протестировали его. Теперь вы можете использовать этот класс в своих Python-приложениях для хранения неизменяемых структур данных.

✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.