Commit f6f3a354 authored by Benjamin Peterson's avatar Benjamin Peterson

add a __dict__ descr for IOBase (closes #12878)

parent 7335e6f3
...@@ -610,6 +610,17 @@ class IOTest(unittest.TestCase): ...@@ -610,6 +610,17 @@ class IOTest(unittest.TestCase):
self.assertEqual(rawio.read(2), None) self.assertEqual(rawio.read(2), None)
self.assertEqual(rawio.read(2), b"") 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): class CIOTest(IOTest):
def test_IOBase_finalize(self): def test_IOBase_finalize(self):
......
...@@ -28,6 +28,8 @@ Core and Builtins ...@@ -28,6 +28,8 @@ Core and Builtins
Library 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 #12636: IDLE reads the coding cookie when executing a Python script.
- Issue #10946: The distutils commands bdist_dumb, bdist_wininst and bdist_msi - Issue #10946: The distutils commands bdist_dumb, bdist_wininst and bdist_msi
......
...@@ -156,6 +156,19 @@ iobase_closed_get(PyObject *self, void *context) ...@@ -156,6 +156,19 @@ iobase_closed_get(PyObject *self, void *context)
return PyBool_FromLong(IS_CLOSED(self)); 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 * PyObject *
_PyIOBase_check_closed(PyObject *self, PyObject *args) _PyIOBase_check_closed(PyObject *self, PyObject *args)
{ {
...@@ -691,6 +704,7 @@ static PyMethodDef iobase_methods[] = { ...@@ -691,6 +704,7 @@ static PyMethodDef iobase_methods[] = {
}; };
static PyGetSetDef iobase_getset[] = { static PyGetSetDef iobase_getset[] = {
{"__dict__", iobase_get_dict, NULL, NULL},
{"closed", (getter)iobase_closed_get, NULL, NULL}, {"closed", (getter)iobase_closed_get, NULL, NULL},
{NULL} {NULL}
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment