[Python-checkins] gh-87995: Make MappingProxyType hashable (GH-94252)
ambv
webhook-mailer at python.org
Tue Jun 28 05:55:07 EDT 2022
https://github.com/python/cpython/commit/efdc9d68de84410b468c2dc87b371b4c3d0663ac
commit: efdc9d68de84410b468c2dc87b371b4c3d0663ac
branch: main
author: Serhiy Storchaka <storchaka at gmail.com>
committer: ambv <lukasz at langa.pl>
date: 2022-06-28T11:54:58+02:00
summary:
gh-87995: Make MappingProxyType hashable (GH-94252)
files:
A Misc/NEWS.d/next/Core and Builtins/2022-06-25-10-19-43.gh-issue-87995.aMDHnp.rst
M Doc/library/types.rst
M Doc/whatsnew/3.12.rst
M Lib/test/test_types.py
M Objects/descrobject.c
diff --git a/Doc/library/types.rst b/Doc/library/types.rst
index e0e77dfbfe7ed..cce0ad960edf9 100644
--- a/Doc/library/types.rst
+++ b/Doc/library/types.rst
@@ -417,6 +417,12 @@ Standard names are defined for the following types:
.. versionadded:: 3.9
+ .. describe:: hash(proxy)
+
+ Return a hash of the underlying mapping.
+
+ .. versionadded:: 3.12
+
Additional Utility Classes and Functions
----------------------------------------
diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst
index 0a4d49841eff8..11e8b87f02881 100644
--- a/Doc/whatsnew/3.12.rst
+++ b/Doc/whatsnew/3.12.rst
@@ -79,6 +79,9 @@ New Features
Other Language Changes
======================
+* :class:`types.MappingProxyType` instances are now hashable if the underlying
+ mapping is hashable.
+ (Contributed by Serhiy Storchaka in :gh:`87995`.)
New Modules
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 8556ca35ca06c..f00da0a758d46 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -1203,6 +1203,16 @@ def test_union(self):
self.assertDictEqual(mapping, {'a': 0, 'b': 1, 'c': 2})
self.assertDictEqual(other, {'c': 3, 'p': 0})
+ def test_hash(self):
+ class HashableDict(dict):
+ def __hash__(self):
+ return 3844817361
+ view = self.mappingproxy({'a': 1, 'b': 2})
+ self.assertRaises(TypeError, hash, view)
+ mapping = HashableDict({'a': 1, 'b': 2})
+ view = self.mappingproxy(mapping)
+ self.assertEqual(hash(view), hash(mapping))
+
class ClassCreationTests(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-06-25-10-19-43.gh-issue-87995.aMDHnp.rst b/Misc/NEWS.d/next/Core and Builtins/2022-06-25-10-19-43.gh-issue-87995.aMDHnp.rst
new file mode 100644
index 0000000000000..4154ebce23495
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-06-25-10-19-43.gh-issue-87995.aMDHnp.rst
@@ -0,0 +1,2 @@
+:class:`types.MappingProxyType` instances are now hashable if the underlying
+mapping is hashable.
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 8ef6a82d7c6d9..82570e085143e 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1178,6 +1178,12 @@ mappingproxy_getiter(mappingproxyobject *pp)
return PyObject_GetIter(pp->mapping);
}
+static Py_hash_t
+mappingproxy_hash(mappingproxyobject *pp)
+{
+ return PyObject_Hash(pp->mapping);
+}
+
static PyObject *
mappingproxy_str(mappingproxyobject *pp)
{
@@ -1901,7 +1907,7 @@ PyTypeObject PyDictProxy_Type = {
&mappingproxy_as_number, /* tp_as_number */
&mappingproxy_as_sequence, /* tp_as_sequence */
&mappingproxy_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
+ (hashfunc)mappingproxy_hash, /* tp_hash */
0, /* tp_call */
(reprfunc)mappingproxy_str, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
More information about the Python-checkins
mailing list