gh-136193: Improve TypeError msg when comparing two SimpleNamespaces (#136195)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
sobolevn 2025-07-02 14:32:41 +03:00 committed by GitHub
parent 51ab66b3d5
commit ab7196a2f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 27 additions and 2 deletions

View file

@ -21,6 +21,7 @@ import types
import unittest.mock
import weakref
import typing
import re
c_types = import_fresh_module('types', fresh=['_types'])
py_types = import_fresh_module('types', blocked=['_types'])
@ -2009,6 +2010,24 @@ class SimpleNamespaceTests(unittest.TestCase):
self.assertEqual(ns1, ns2)
self.assertNotEqual(ns2, types.SimpleNamespace())
def test_richcompare_unsupported(self):
ns1 = types.SimpleNamespace(x=1)
ns2 = types.SimpleNamespace(y=2)
msg = re.escape(
"not supported between instances of "
"'types.SimpleNamespace' and 'types.SimpleNamespace'"
)
with self.assertRaisesRegex(TypeError, msg):
ns1 > ns2
with self.assertRaisesRegex(TypeError, msg):
ns1 >= ns2
with self.assertRaisesRegex(TypeError, msg):
ns1 < ns2
with self.assertRaisesRegex(TypeError, msg):
ns1 <= ns2
def test_nested(self):
ns1 = types.SimpleNamespace(a=1, b=2)
ns2 = types.SimpleNamespace()

View file

@ -0,0 +1,2 @@
Improve :exc:`TypeError` error message, when richcomparing two
:class:`types.SimpleNamespace` objects.

View file

@ -194,10 +194,14 @@ namespace_clear(PyObject *op)
static PyObject *
namespace_richcompare(PyObject *self, PyObject *other, int op)
{
if (PyObject_TypeCheck(self, &_PyNamespace_Type) &&
PyObject_TypeCheck(other, &_PyNamespace_Type))
if (
(op == Py_EQ || op == Py_NE) &&
PyObject_TypeCheck(self, &_PyNamespace_Type) &&
PyObject_TypeCheck(other, &_PyNamespace_Type)
) {
return PyObject_RichCompare(((_PyNamespaceObject *)self)->ns_dict,
((_PyNamespaceObject *)other)->ns_dict, op);
}
Py_RETURN_NOTIMPLEMENTED;
}