Skip to content

Commit ed0153a

Browse files
authored
Merge pull request #532 from realpython/python-mappings
Python mappings
2 parents e486b88 + 6d137a4 commit ed0153a

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

python-mappings/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Python Mappings: A Comprehensive Guide
2+
3+
This folder contains source code for the Real Python tutorial [Python Mappings: A Comprehensive Guide](https://realpython.com/python-mappings/).
4+
5+
For more code, intermediate steps, and additional explanation, check out the associated tutorial.

python-mappings/pizza_menu.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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+
def _raise_duplicate_key_error(self, key):
16+
raise ValueError(
17+
f"'{key}' is invalid. All pizzas must have unique first letters"
18+
)
19+
20+
def __getitem__(self, key):
21+
if key not in self._menu and len(key) > 1:
22+
raise KeyError(key)
23+
key = self._first_letters.get(key[0].lower(), key)
24+
return self._menu[key]
25+
26+
def __setitem__(self, key, value):
27+
first_letter = key[0].lower()
28+
if len(key) == 1:
29+
key = self._first_letters.get(first_letter, key)
30+
if key in self._menu:
31+
self._menu[key] = value
32+
elif first_letter in self._first_letters:
33+
self._raise_duplicate_key_error(key)
34+
else:
35+
self._first_letters[first_letter] = key
36+
self._menu[key] = value
37+
38+
def __delitem__(self, key):
39+
if key not in self._menu and len(key) > 1:
40+
raise KeyError(key)
41+
key = self._first_letters.pop(key[0].lower(), key)
42+
del self._menu[key]
43+
44+
def __iter__(self):
45+
return iter(self._menu)
46+
47+
def __len__(self):
48+
return len(self._menu)
49+
50+
def __repr__(self):
51+
return f"{self.__class__.__name__}({self._menu})"
52+
53+
def __str__(self):
54+
return str(self._menu)
55+
56+
def __contains__(self, key):
57+
return key in self._menu

0 commit comments

Comments
 (0)