From: Benjamin Peterson Date: Sat, 3 Sep 2011 13:26:20 +0000 (-0400) Subject: add a __dict__ descr for IOBase (closes #12878) X-Git-Tag: v3.3.0a1~1574^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f6f3a3544783496301537bc5c946b58b0e5cbac8;p=python add a __dict__ descr for IOBase (closes #12878) --- diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 72c9a2d8a7..0dc9d6dff4 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -610,6 +610,17 @@ class IOTest(unittest.TestCase): self.assertEqual(rawio.read(2), None) self.assertEqual(rawio.read(2), b"") + def test_types_have_dict(self): + test = ( + self.IOBase(), + self.RawIOBase(), + self.TextIOBase(), + self.StringIO(), + self.BytesIO() + ) + for obj in test: + self.assertTrue(hasattr(obj, "__dict__")) + class CIOTest(IOTest): def test_IOBase_finalize(self): diff --git a/Misc/NEWS b/Misc/NEWS index f489ab257e..514d19afed 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -28,6 +28,8 @@ Core and Builtins Library ------- +- Issue #12878: Expose a __dict__ attribute on io.IOBase and its subclasses. + - Issue #12636: IDLE reads the coding cookie when executing a Python script. - Issue #10946: The distutils commands bdist_dumb, bdist_wininst and bdist_msi diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index f06f562947..2c59d42421 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -156,6 +156,19 @@ iobase_closed_get(PyObject *self, void *context) return PyBool_FromLong(IS_CLOSED(self)); } +static PyObject * +iobase_get_dict(PyObject *self) +{ + PyObject **dictptr = _PyObject_GetDictPtr(self); + PyObject *dict; + assert(dictptr); + dict = *dictptr; + if (dict == NULL) + dict = *dictptr = PyDict_New(); + Py_XINCREF(dict); + return dict; +} + PyObject * _PyIOBase_check_closed(PyObject *self, PyObject *args) { @@ -691,6 +704,7 @@ static PyMethodDef iobase_methods[] = { }; static PyGetSetDef iobase_getset[] = { + {"__dict__", iobase_get_dict, NULL, NULL}, {"closed", (getter)iobase_closed_get, NULL, NULL}, {NULL} };