diff -r 59a189a15933 Lib/test/test_descr.py --- a/Lib/test/test_descr.py Thu Oct 25 17:23:54 2012 -0700 +++ b/Lib/test/test_descr.py Fri Oct 26 14:03:52 2012 -0700 @@ -4501,17 +4501,16 @@ order (MRO) for bases """ self.assertEqual(complex.real.__qualname__, 'complex.real') self.assertEqual(float.real.__qualname__, 'float.real') self.assertEqual(int.__add__.__qualname__, 'int.__add__') def test_qualname_dict(self): ns = {'__qualname__': 'some.name'} tp = type('Foo', (), ns) self.assertEqual(tp.__qualname__, 'some.name') - self.assertEqual(tp.__dict__['__qualname__'], 'some.name') self.assertEqual(ns, {'__qualname__': 'some.name'}) ns = {'__qualname__': 1} self.assertRaises(TypeError, type, 'Foo', (), ns) def test_cycle_through_dict(self): # See bug #1469629 class X(dict): @@ -4559,37 +4558,37 @@ class DictProxyTests(unittest.TestCase): 'trace function introduces __local__') def test_iter_keys(self): # Testing dict-proxy keys... it = self.C.__dict__.keys() self.assertNotIsInstance(it, list) 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__') def test_iter_values(self): # Testing dict-proxy values... 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__') def test_iter_items(self): # Testing dict-proxy iteritems... it = self.C.__dict__.items() self.assertNotIsInstance(it, list) 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... class B(object): pass class M(type): pass class C(metaclass=M): diff -r 59a189a15933 Objects/typeobject.c --- a/Objects/typeobject.c Thu Oct 25 17:23:54 2012 -0700 +++ b/Objects/typeobject.c Fri Oct 26 14:03:52 2012 -0700 @@ -2245,21 +2245,20 @@ type_new(PyTypeObject *metatype, PyObjec if (qualname != NULL) { if (!PyUnicode_Check(qualname)) { PyErr_Format(PyExc_TypeError, "type __qualname__ must be a str, not %s", Py_TYPE(qualname)->tp_name); 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; if that fails, it will still look into __dict__. */ { PyObject *doc = _PyDict_GetItemId(dict, &PyId___doc__); if (doc != NULL && PyUnicode_Check(doc)) {