Python: Словарь с псевдонимами

Python: Введение в ООП 2 сообщения
30
Студентов
76%
Завершения
Обновлено: 24 февр., 18:35

Как вы уже знаете, в Python многое работает на основе протоколов. Обращение по индексу или ключу — через те самые квадратные скобки — тоже работает с любыми объектами, реализующими "subscription protocol".

Этот протокол требует, чтобы у объекта имелись нужного вида методы __getitem__() и __setitem__(), первый из которых позволяет получить значение по ключу или индексу, а второй сохранить значение по указанному ключу. Вот так эти методы работают для словаря:

>>> d = {}
>>> d = {'a': 42}
>>> d.__getitem__('a')       # то есть d['a']
42
>>> d.__setitem__('a', 100)  # то есть d['a'] = 100
>>> d
{'a': 100}
>>> d.__setitem__('a', d.__getitem__('a') + 5)
>>> # а это уже d['a'] += 5

Подробнее о методах можно почитать здесь:

src/solution.py

Вам нужно реализовать класс MultiKeyDict, который должен уметь работать по протоколу __getitem__()/__setitem__().

Класс принимает именованные параметры, которые становятся первыми ключами и значениями. В этом класс максимально похож на dict. А вот метод alias() уже является отличием: вызывая этот метод с параметрами "новый_ключ='старый_ключ'", вы создаёте псевдонимы для существующих ключей.

Обращение по созданному псевдониму ничем не отличается от обращения по оригинальному ключу, то есть с момента создания псевдонима у значения становится два ключа (или больше, конечно же).

Важно, что с помощью метода alias() должно быть возможно "перекинуть" старые ключи на новые значения без потери этих самых значений, если останется хотя бы один псевдоним, всё ещё ссылающийся на значение.

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

>>> mkd = MultiKeyDict(x=100, y=[10, 20])
>>>
>>> mkd.alias(z='x')  # 'z' теперь означает то же, что и 'x'
>>> mkd['z']
100
>>> mkd['z'] += 1  # Можно даже менять значение через присваивание,
>>> mkd['x']       # что затронет и оригинальный ключ.
101
>>> mkd.alias(z='y')  # Теперь 'z' уже равнозначен 'y'
>>> mkd['z'] += [30]
>>> mkd['y']
[10, 20, 30]

Для полного доступа к испытанию нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов