Skip to content

Commit 2d2cb83

Browse files
authored
Merge pull request #416 from python/feature/no-getitem-none
Raise KeyError when requesting a metadata value that doesn't exist
2 parents 7662a60 + 612603c commit 2d2cb83

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

CHANGES.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
v6.0.0
2+
======
3+
4+
* #371: When a key is missing from metadata, raise a ``KeyError``
5+
instead of returning ``None``, matching the usual expectation for
6+
mapping objects and also the protocol definition.
7+
8+
Projects should update to expect the ``KeyError`` or wrap the call
9+
to replace a ``KeyError`` with a ``None`` return, e.g.::
10+
11+
try:
12+
value = metadata(pkg)['Name']
13+
except KeyError:
14+
value = None
15+
116
v5.1.0
217
======
318

importlib_metadata/_adapters.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,20 @@ def __init__(self, *args, **kwargs):
3939
def __iter__(self):
4040
return super().__iter__()
4141

42+
def __getitem__(self, item):
43+
"""
44+
Prefer dict-like behavior for __getitem__ when keys are missing.
45+
>>> msg = Message(email.message.Message())
46+
>>> msg['thing']
47+
Traceback (most recent call last):
48+
...
49+
KeyError: 'thing'
50+
"""
51+
res = super().__getitem__(item)
52+
if res is None:
53+
raise KeyError(item)
54+
return res
55+
4256
def _repair_headers(self):
4357
def redent(value):
4458
"Correct for RFC822 indentation"

tests/test_api.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,14 @@ def test_importlib_metadata_version(self):
141141
resolved = version('importlib-metadata')
142142
assert re.match(self.version_pattern, resolved)
143143

144+
def test_missing_key(self):
145+
"""
146+
Attempting to request missing metadata raises KeyError.
147+
"""
148+
md = metadata('distinfo-pkg')
149+
with self.assertRaises(KeyError):
150+
md['does-not-exist']
151+
144152
@staticmethod
145153
def _test_files(files):
146154
root = files[0].root

0 commit comments

Comments
 (0)