]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-136193: Improve `TypeError` msg when comparing two `SimpleNamespace`s (#136195)
authorsobolevn <mail@sobolevn.me>
Wed, 2 Jul 2025 11:32:41 +0000 (14:32 +0300)
committerGitHub <noreply@github.com>
Wed, 2 Jul 2025 11:32:41 +0000 (14:32 +0300)
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Lib/test/test_types.py
Misc/NEWS.d/next/Library/2025-07-02-10-48-21.gh-issue-136193.xfvras.rst [new file with mode: 0644]
Objects/namespaceobject.c

index fc26e71ffcb67b4edd3bec09e94f28a47169792d..116f55051ddb5a072b8cdc6b34f47bc923e17c5c 100644 (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()
diff --git a/Misc/NEWS.d/next/Library/2025-07-02-10-48-21.gh-issue-136193.xfvras.rst b/Misc/NEWS.d/next/Library/2025-07-02-10-48-21.gh-issue-136193.xfvras.rst
new file mode 100644 (file)
index 0000000..8011152
--- /dev/null
@@ -0,0 +1,2 @@
+Improve :exc:`TypeError` error message, when richcomparing two
+:class:`types.SimpleNamespace` objects.
index 0fc2bcea4cb06e57ad2c04a6b6f5d6832bc8ccad..201cb8a7df8da1f29290d14943aefb2788cac4d3 100644 (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;
 }