https://github.com/python/cpython/commit/7d175caf212565b3b89cf3c537c38adab52306a5
commit: 7d175caf212565b3b89cf3c537c38adab52306a5
branch: 3.12
author: Miss Islington (bot) <31488909+miss-isling...@users.noreply.github.com>
committer: vstinner <vstin...@python.org>
date: 2024-11-28T17:32:50Z
summary:

[3.12] gh-127190: Fix local_setattro() error handling (GH-127366) (#127368)

gh-127190: Fix local_setattro() error handling (GH-127366)

Don't make the assumption that the 'name' argument is a string. Use
repr() to format the 'name' argument instead.
(cherry picked from commit 20657fbdb14d50ca4ec115da0cbef155871d8d33)

Co-authored-by: Victor Stinner <vstin...@python.org>

files:
M Lib/test/test_threading_local.py
M Modules/_threadmodule.c

diff --git a/Lib/test/test_threading_local.py b/Lib/test/test_threading_local.py
index f0b829a978feb5..3a58afd8194a32 100644
--- a/Lib/test/test_threading_local.py
+++ b/Lib/test/test_threading_local.py
@@ -208,6 +208,21 @@ def test_threading_local_clear_race(self):
 
         _testcapi.join_temporary_c_thread()
 
+    @support.cpython_only
+    def test_error(self):
+        class Loop(self._local):
+            attr = 1
+
+        # Trick the "if name == '__dict__':" test of __setattr__()
+        # to always be true
+        class NameCompareTrue:
+            def __eq__(self, other):
+                return True
+
+        loop = Loop()
+        with self.assertRaisesRegex(AttributeError, 'Loop.*read-only'):
+            loop.__setattr__(NameCompareTrue(), 2)
+
 
 class ThreadLocalTest(unittest.TestCase, BaseLocalTest):
     _local = _thread._local
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index 518c246e98caf6..366ee6186de0d5 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -961,7 +961,7 @@ local_setattro(localobject *self, PyObject *name, PyObject 
*v)
     }
     if (r == 1) {
         PyErr_Format(PyExc_AttributeError,
-                     "'%.100s' object attribute '%U' is read-only",
+                     "'%.100s' object attribute %R is read-only",
                      Py_TYPE(self)->tp_name, name);
         return -1;
     }

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to