]> granicus.if.org Git - python/commitdiff
SF bug #770485: cStringIO does not set closed attr
authorRaymond Hettinger <python@rcn.com>
Fri, 8 Aug 2003 12:20:03 +0000 (12:20 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 8 Aug 2003 12:20:03 +0000 (12:20 +0000)
Lib/test/test_StringIO.py
Misc/NEWS
Modules/cStringIO.c

index 8c367e8c79cd59b8969abc87ee85cf1cde69d62a..c318eaafc79c0bcc545f7c27071e7b48757a35b7 100644 (file)
@@ -55,6 +55,16 @@ class TestGenericStringIO(unittest.TestCase):
         f.close()
         self.assertRaises(ValueError, f.write, 'frobnitz')
 
+    def test_closed_flag(self):
+        f = self.MODULE.StringIO()
+        self.assertEqual(f.closed, False)
+        f.close()
+        self.assertEqual(f.closed, True)
+        f = self.MODULE.StringIO("abc")
+        self.assertEqual(f.closed, False)
+        f.close()
+        self.assertEqual(f.closed, True)
+
     def test_iterator(self):
         eq = self.assertEqual
         unless = self.failUnless
index 410391cd135cd306f4d12a63c725056c9af521bb..1de08e7249f641516619d3d5fd7481c3a456ddc2 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,8 @@ Core and builtins
 Extension modules
 -----------------
 
+- cStringIO now supports the f.closed attribute.
+
 - The signal module now exposes SIGRTMIN and SIGRTMAX (if available).
 
 Library
index bc23c77fb60aac0e1679ab967de43646ac492764..ac84ab0c51b01f5d4a6039449d85c92991852d14 100644 (file)
@@ -87,6 +87,22 @@ IO__opencheck(IOobject *self) {
         return 1;
 }
 
+static PyObject *
+IO_get_closed(IOobject *self, void *closure)
+{
+       PyObject *result = Py_False;
+
+       if (self->buf == NULL)
+               result = Py_True;
+       Py_INCREF(result);
+       return result;
+}
+
+static PyGetSetDef file_getsetlist[] = {
+       {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},
+       {0},
+};
+
 static PyObject *
 IO_flush(IOobject *self, PyObject *unused) {
 
@@ -455,6 +471,7 @@ static struct PyMethodDef O_methods[] = {
 static PyMemberDef O_memberlist[] = {
        {"softspace",   T_INT,  offsetof(Oobject, softspace),   0,
         "flag indicating that a space needs to be printed; used by print"},
+        /* getattr(f, "closed") is implemented without this table */
        {NULL} /* Sentinel */
 };
 
@@ -498,7 +515,8 @@ static PyTypeObject Otype = {
   PyObject_SelfIter,           /*tp_iter */
   (iternextfunc)IO_iternext,   /*tp_iternext */
   O_methods,                   /*tp_methods */
-  O_memberlist                 /*tp_members */
+  O_memberlist,                        /*tp_members */
+  file_getsetlist,             /*tp_getset */
 };
 
 static PyObject *
@@ -614,7 +632,9 @@ static PyTypeObject Itype = {
   0,                                   /* tp_weaklistoffset */
   PyObject_SelfIter,                   /* tp_iter */
   (iternextfunc)IO_iternext,           /* tp_iternext */
-  I_methods                            /* tp_methods */
+  I_methods,                           /* tp_methods */
+  0,                                   /* tp_members */
+  file_getsetlist,                     /* tp_getset */
 };
 
 static PyObject *