bpo-39264: Fix UserDict.get() to account for __missing__() (GH-17910)

Here's the patch according to the discussion at the [Python-Dev mailing list](https://mail.python.org/archives/list/python-dev@python.org/thread/SDXOEMAEM6KQ3CQCJVBVRT5QNSPAVU6X/).
UserDict.get() will match dict's behavior and not call `__missing__`.

Automerge-Triggered-By: GH:rhettinger
This commit is contained in:
Bar Harel 2022-05-11 00:23:45 +03:00 committed by GitHub
parent f481a02e6c
commit 30a43586f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 1 deletions

View File

@ -1132,10 +1132,17 @@ class UserDict(_collections_abc.MutableMapping):
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)

View File

@ -71,6 +71,14 @@ class TestUserObjects(unittest.TestCase):
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)

View File

@ -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.