Словарь с псевдонимами Испытание курса: Python: Введение в ООП

Как вы уже знаете, в 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]
Успешных завершений: 76%

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

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

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

Последние код-ревью

Автор Дата обновления Версий
_artemy 11 сент., 12:14 1
sharknoise 05 сент., 19:53 1
user-60f6c2532e340d4e 31 авг., 08:29 1
vitaliipaprotskyi 22 авг., 18:50 2
user-110df8b01617705f 07 авг., 18:33 1