Skip to content

Commit 3c57e62

Browse files
Create pizza_menu.py
1 parent 9beba21 commit 3c57e62

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

python-mappings/pizza_menu.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from collections.abc import MutableMapping
2+
3+
4+
class PizzaMenu(MutableMapping):
5+
def __init__(self, menu: dict):
6+
self._menu = {}
7+
self._first_letters = {}
8+
for key, value in menu.items():
9+
first_letter = key[0].lower()
10+
if first_letter in self._first_letters:
11+
self._raise_duplicate_key_error(key)
12+
self._first_letters[first_letter] = key
13+
self._menu[key] = value
14+
15+
16+
def _raise_duplicate_key_error(self, key):
17+
raise ValueError(
18+
f"'{key}' is an invalid name. All pizzas must have unique first letters"
19+
)
20+
21+
22+
def __getitem__(self, key):
23+
if key not in self._menu and len(key) > 1:
24+
raise KeyError(key)
25+
key = self._first_letters.get(key[0].lower(), key)
26+
return self._menu[key]
27+
28+
29+
def __setitem__(self, key, value):
30+
first_letter = key[0].lower()
31+
if len(key) == 1:
32+
key = self._first_letters.get(first_letter, key)
33+
if key in self._menu:
34+
self._menu[key] = value
35+
elif first_letter in self._first_letters:
36+
self._raise_duplicate_key_error(key)
37+
else:
38+
self._first_letters[first_letter] = key
39+
self._menu[key] = value
40+
41+
42+
def __delitem__(self, key):
43+
if key not in self._menu and len(key) > 1:
44+
raise KeyError(key)
45+
key = self._first_letters.pop(key[0].lower(), key)
46+
del self._menu[key]
47+
48+
49+
def __iter__(self):
50+
return iter(self._menu)
51+
52+
53+
def __len__(self):
54+
return len(self._menu)
55+
56+
57+
def __repr__(self):
58+
return f"{self.__class__.__name__}({self._menu})"
59+
60+
61+
def __str__(self):
62+
return str(self._menu)
63+
64+
65+
def __contains__(self, key):
66+
return key in self._menu

0 commit comments

Comments
 (0)