From 0a29d8408cfdd9a66f2b65745a3ae1cda022775c Mon Sep 17 00:00:00 2001 From: da-woods Date: Mon, 29 Jun 2026 20:54:22 +0100 Subject: [PATCH] gh-152492 Allow `OrderedDict.update` to work with `frozendict` (#152494) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: sobolevn --- Lib/test/test_ordered_dict.py | 7 ++++++- .../2026-06-28-14-31-03.gh-issue-152492._09Zee.rst | 1 + Objects/odictobject.c | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-06-28-14-31-03.gh-issue-152492._09Zee.rst diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py index 84bb3fdfbaaa..ac24110cf63e 100644 --- a/Lib/test/test_ordered_dict.py +++ b/Lib/test/test_ordered_dict.py @@ -74,6 +74,9 @@ class OrderedDictTests: od.update(dict(pairs)) self.assertEqual(sorted(od.items()), pairs) # dict input od = OrderedDict() + od.update(frozendict(pairs)) + self.assertEqual(sorted(od.items()), pairs) # frozendict input + od = OrderedDict() od.update(**dict(pairs)) self.assertEqual(sorted(od.items()), pairs) # kwds input od = OrderedDict() @@ -288,9 +291,11 @@ class OrderedDictTests: pairs = pairs[2:] + pairs[:2] od2 = OrderedDict(pairs) self.assertNotEqual(od1, od2) # different order implies inequality - # comparison to regular dict is not order sensitive + # comparison to regular (frozen)dict is not order sensitive self.assertEqual(od1, dict(od2)) self.assertEqual(dict(od2), od1) + self.assertEqual(od1, frozendict(od2)) + self.assertEqual(frozendict(od1), od2) # different length implied inequality self.assertNotEqual(od1, OrderedDict(pairs[:-1])) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-06-28-14-31-03.gh-issue-152492._09Zee.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-28-14-31-03.gh-issue-152492._09Zee.rst new file mode 100644 index 000000000000..16cb5a205c90 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-28-14-31-03.gh-issue-152492._09Zee.rst @@ -0,0 +1 @@ +:type:`collections.OrderedDict` ``update`` method can now accept :type:`frozendict` as an argument. diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 6d7e436ff008..c51fd4b7195d 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1503,7 +1503,7 @@ odict_tp_clear(PyObject *op) static PyObject * odict_richcompare_lock_held(PyObject *v, PyObject *w, int op) { - if (!PyODict_Check(v) || !PyDict_Check(w)) { + if (!PyODict_Check(v) || !PyAnyDict_Check(w)) { Py_RETURN_NOTIMPLEMENTED; } @@ -2370,7 +2370,7 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) } /* now handle kwargs */ - assert(kwargs == NULL || PyDict_Check(kwargs)); + assert(kwargs == NULL || PyAnyDict_Check(kwargs)); if (kwargs != NULL && PyDict_GET_SIZE(kwargs)) { PyObject *items = PyDict_Items(kwargs); if (items == NULL) -- 2.47.3