From f5eb35ce592fa532c5a11b1fa960406b367cff5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Huy=20V=C5=A9=20=28Josh=29?= Date: Sat, 28 Mar 2026 22:51:49 +0700 Subject: [PATCH] type.__new__: preserve caller namespace when reading __qualname__ (#7524) * type.__new__: preserve caller namespace when reading __qualname__ * type.__new__: preserve caller namespace when reading __qualname__ --- Lib/test/test_descr.py | 1 - crates/vm/src/builtins/type.rs | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 8a31d8ea0..ab2290c96 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4987,7 +4987,6 @@ class ClassPropertiesAndMethods(unittest.TestCase): self.assertEqual(Y.__qualname__, 'Y') self.assertEqual(Y.Inside.__qualname__, 'Y.Inside') - @unittest.expectedFailure # TODO: RUSTPYTHON def test_qualname_dict(self): ns = {'__qualname__': 'some.name'} tp = type('Foo', (), ns) diff --git a/crates/vm/src/builtins/type.rs b/crates/vm/src/builtins/type.rs index 5f351afca..64801a1de 100644 --- a/crates/vm/src/builtins/type.rs +++ b/crates/vm/src/builtins/type.rs @@ -1868,14 +1868,16 @@ impl Constructor for PyType { }; let qualname = dict - .pop_item(identifier!(vm, __qualname__).as_object(), vm)? + .get_item_opt(identifier!(vm, __qualname__), vm)? .map(|obj| downcast_qualname(obj, vm)) .transpose()? .unwrap_or_else(|| { // If __qualname__ is not provided, we can use the name as default name.clone().into_wtf8() }); + let mut attributes = dict.to_attributes(vm); + attributes.shift_remove(identifier!(vm, __qualname__)); // Check __doc__ for surrogates - raises UnicodeEncodeError during type creation if let Some(doc) = attributes.get(identifier!(vm, __doc__))