mirror of https://github.com/python/cpython
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:
parent
f481a02e6c
commit
30a43586f0
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue