From 547298c94cd491dbfaa7bc5f968c2bdcf91588cc Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 16 Oct 2012 22:35:38 -0700 Subject: [PATCH] Close #16160: Subclass support now works for types.SimpleNamespace. Thanks to RDM for noticing. --- Lib/test/test_types.py | 9 +++++++++ Misc/NEWS | 2 ++ Objects/namespaceobject.c | 22 +++++++++++----------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 3f5ac98a0e3..3ee4c6bc5fd 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -1135,6 +1135,15 @@ class SimpleNamespaceTests(unittest.TestCase): with self.assertRaises(TypeError): ns['spam'] + def test_subclass(self): + class Spam(types.SimpleNamespace): + pass + + spam = Spam(ham=8, eggs=9) + + self.assertIs(type(spam), Spam) + self.assertEqual(vars(spam), {'ham': 8, 'eggs': 9}) + def test_main(): run_unittest(TypesTests, MappingProxyTests, ClassCreationTests, diff --git a/Misc/NEWS b/Misc/NEWS index 798ce782807..944141254f6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -15,6 +15,8 @@ Core and Builtins - Issue #14783: Improve int() docstring and switch docstrings for str(), range(), and slice() to use multi-line signatures. +- Issue #16160: Subclass support now works for types.SimpleNamespace. + - Issue #15379: Fix passing of non-BMP characters as integers for the charmap decoder (already working as unicode strings). Patch by Serhiy Storchaka. diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index 753874c3cbe..ff278d33474 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -21,19 +21,19 @@ static PyMemberDef namespace_members[] = { static PyObject * namespace_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - _PyNamespaceObject *ns; - ns = PyObject_GC_New(_PyNamespaceObject, &_PyNamespace_Type); - if (ns == NULL) - return NULL; + PyObject *self; - ns->ns_dict = PyDict_New(); - if (ns->ns_dict == NULL) { - Py_DECREF(ns); - return NULL; + assert(type != NULL && type->tp_alloc != NULL); + self = type->tp_alloc(type, 0); + if (self != NULL) { + _PyNamespaceObject *ns = (_PyNamespaceObject *)self; + ns->ns_dict = PyDict_New(); + if (ns->ns_dict == NULL) { + Py_DECREF(ns); + return NULL; + } } - - PyObject_GC_Track(ns); - return (PyObject *)ns; + return self; }