From 30a43586f0d1776d25beb71b92f9880be7997e1b Mon Sep 17 00:00:00 2001 From: Bar Harel Date: Wed, 11 May 2022 00:23:45 +0300 Subject: [PATCH] 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 --- Lib/collections/__init__.py | 9 ++++++++- Lib/test/test_collections.py | 8 ++++++++ .../Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 7af8dcd526df81..58607874be93d6 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -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) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index fa1d0e014dee92..59b3f2ec7bfcb6 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -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) diff --git a/Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst b/Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst new file mode 100644 index 00000000000000..5f9ffdffce5c26 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst @@ -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.