Skip to content

Commit

Permalink
bpo-39264: Fix UserDict.get() to account for __missing__() (GH-17910)
Browse files Browse the repository at this point in the history
Here's the patch according to the discussion at the [Python-Dev mailing list](https://mail.python.org/archives/list/[email protected]/thread/SDXOEMAEM6KQ3CQCJVBVRT5QNSPAVU6X/).
UserDict.get() will match dict's behavior and not call `__missing__`.

Automerge-Triggered-By: GH:rhettinger
  • Loading branch information
bharel authored May 10, 2022
1 parent f481a02 commit 30a4358
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 1 deletion.
9 changes: 8 additions & 1 deletion Lib/collections/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1132,10 +1132,17 @@ def __delitem__(self, key):
def __iter__(self):
return iter(self.data)

# Modify __contains__ to work correctly when __missing__ is present
# Modify __contains__ and get() to work like dict
# does when __missing__ is present.
def __contains__(self, key):
return key in self.data

def get(self, key, default=None):
if key in self:
return self[key]
return default


# Now, add the methods in dicts but not in MutableMapping
def __repr__(self):
return repr(self.data)
Expand Down
8 changes: 8 additions & 0 deletions Lib/test/test_collections.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ def test_dict_copy(self):
obj[123] = "abc"
self._copy_test(obj)

def test_dict_missing(self):
class A(UserDict):
def __missing__(self, key):
return 456
self.assertEqual(A()[123], 456)
# get() ignores __missing__ on dict
self.assertIs(A().get(123), None)


################################################################################
### ChainMap (helper class for configparser and the string module)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fixed :meth:`collections.UserDict.get` to not call
:meth:`__missing__` when a value is not found. This matches the behavior of
:class:`dict`. Patch by Bar Harel.

0 comments on commit 30a4358

Please sign in to comment.