]> granicus.if.org Git - python/commitdiff
don't shadow the __qualname__ descriptor with __qualname__ in the class's __dict__...
authorBenjamin Peterson <benjamin@python.org>
Wed, 31 Oct 2012 03:51:03 +0000 (23:51 -0400)
committerBenjamin Peterson <benjamin@python.org>
Wed, 31 Oct 2012 03:51:03 +0000 (23:51 -0400)
Lib/test/test_descr.py
Misc/NEWS
Objects/typeobject.c

index 079f60b88bcf2cdbea70f39de525e1b1f2585ea4..21c7b8cbb26ecfcf0affe4269a3fb563848b58c0 100644 (file)
@@ -4506,7 +4506,7 @@ order (MRO) for bases """
         ns = {'__qualname__': 'some.name'}
         tp = type('Foo', (), ns)
         self.assertEqual(tp.__qualname__, 'some.name')
-        self.assertEqual(tp.__dict__['__qualname__'], 'some.name')
+        self.assertNotIn('__qualname__', tp.__dict__)
         self.assertEqual(ns, {'__qualname__': 'some.name'})
 
         ns = {'__qualname__': 1}
@@ -4564,7 +4564,7 @@ class DictProxyTests(unittest.TestCase):
         keys = list(it)
         keys.sort()
         self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
-                                '__qualname__', '__weakref__', 'meth'])
+                                '__weakref__', 'meth'])
 
     @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
                         'trace function introduces __local__')
@@ -4573,7 +4573,7 @@ class DictProxyTests(unittest.TestCase):
         it = self.C.__dict__.values()
         self.assertNotIsInstance(it, list)
         values = list(it)
-        self.assertEqual(len(values), 6)
+        self.assertEqual(len(values), 5)
 
     @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
                         'trace function introduces __local__')
@@ -4584,7 +4584,7 @@ class DictProxyTests(unittest.TestCase):
         keys = [item[0] for item in it]
         keys.sort()
         self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
-                                '__qualname__', '__weakref__', 'meth'])
+                                '__weakref__', 'meth'])
 
     def test_dict_type_with_metaclass(self):
         # Testing type of __dict__ when metaclass set...
index 44ae5f008c380aa02bcdcd9d1a1d1913b3c42755..726d1f75ce4c84e6fe4996130d889b9b77918470 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 3.3.1?
 Core and Builtins
 -----------------
 
+- Issue #16271: Fix strange bugs that resulted from __qualname__ appearing in a
+  class's __dict__ and on type.
+
 - Issue #16197: Update winreg docstrings and documentation to match code.      
   Patch by Zachary Ware.
 
index 5d625a21eac35471306f38d72e4d666da55c35eb..9f0d13e3695defd521ce08ee3913d229b27193c1 100644 (file)
@@ -2250,11 +2250,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
             goto error;
         }
     }
-    else {
-        qualname = et->ht_name;
-    }
-    Py_INCREF(qualname);
-    et->ht_qualname = qualname;
+    et->ht_qualname = qualname ? qualname : et->ht_name;
+    Py_INCREF(et->ht_qualname);
+    if (qualname != NULL && PyDict_DelItem(dict, PyId___qualname__.object) < 0)
+        goto error;
 
     /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
        and is a string.  The __doc__ accessor will first look for tp_doc;