https://github.com/python/cpython/commit/f7c05d7ad3075a1dbeed86b6b12903032e4afba6
commit: f7c05d7ad3075a1dbeed86b6b12903032e4afba6
branch: main
author: Furkan Onder <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-01-29T01:05:29+02:00
summary:

gh-55664: Add warning when creating a type using a namespace dictionary with 
non-string keys. (GH-105338)

Co-authored-by: Daniel Urban <[email protected]>

files:
A Misc/NEWS.d/next/Core and 
Builtins/2023-06-06-19-09-00.gh-issue-55664.vYYl0V.rst
M Lib/test/test_descr.py
M Objects/typeobject.c

diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index fd0af9b30a0a71..beeab6cb7f254c 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -4734,6 +4734,20 @@ class X(object):
         with self.assertRaises(AttributeError):
             del X.__abstractmethods__
 
+    def test_gh55664(self):
+        # gh-55664: issue a warning when the
+        # __dict__ of a class contains non-string keys
+        with self.assertWarnsRegex(RuntimeWarning, 'MyClass'):
+            MyClass = type('MyClass', (), {1: 2})
+
+        class meta(type):
+            def __new__(mcls, name, bases, ns):
+                ns[1] = 2
+                return super().__new__(mcls, name, bases, ns)
+
+        with self.assertWarnsRegex(RuntimeWarning, 'MyClass'):
+            MyClass = meta('MyClass', (), {})
+
     def test_proxy_call(self):
         class FakeStr:
             __class__ = str
@@ -5151,7 +5165,8 @@ class Base2(object):
             mykey = 'from Base2'
             mykey2 = 'from Base2'
 
-        X = type('X', (Base,), {MyKey(): 5})
+        with self.assertWarnsRegex(RuntimeWarning, 'X'):
+            X = type('X', (Base,), {MyKey(): 5})
         # mykey is read from Base
         self.assertEqual(X.mykey, 'from Base')
         # mykey2 is read from Base2 because MyKey.__eq__ has set __bases__
diff --git a/Misc/NEWS.d/next/Core and 
Builtins/2023-06-06-19-09-00.gh-issue-55664.vYYl0V.rst b/Misc/NEWS.d/next/Core 
and Builtins/2023-06-06-19-09-00.gh-issue-55664.vYYl0V.rst
new file mode 100644
index 00000000000000..438be985496650
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and 
Builtins/2023-06-06-19-09-00.gh-issue-55664.vYYl0V.rst  
@@ -0,0 +1 @@
+Add warning when creating :class:`type` using a namespace dictionary with 
non-string keys. Patched by Daniel Urban and Furkan Onder.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 114cf21f95e744..a850473cad813d 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3828,6 +3828,17 @@ type_new_impl(type_new_ctx *ctx)
     // Put the proper slots in place
     fixup_slot_dispatchers(type);
 
+    if (!_PyDict_HasOnlyStringKeys(type->tp_dict)) {
+        if (PyErr_WarnFormat(
+                PyExc_RuntimeWarning,
+                1,
+                "non-string key in the __dict__ of class %.200s",
+                type->tp_name) == -1)
+        {
+            goto error;
+        }
+    }
+
     if (type_new_set_names(type) < 0) {
         goto error;
     }

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to