Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Using the 'with' statement with cStringIO objects

16 views
Skip to first unread message

peppergrower

unread,
Sep 27, 2008, 5:21:06 AM9/27/08
to
I've been experimenting with the 'with' statement (in __future__), and
so far I like it. However, I can't get it to work with a cStringIO
object. Here's a minimum working example:

###
from __future__ import with_statement
import cStringIO

teststring='this is a test'

with cStringIO.StringIO(teststring) as testfile:
pass
###

I get the following error message:

Traceback (most recent call last):
File "testfile.py", line 6, in <module>
with cStringIO.StringIO(teststring) as testfile:
AttributeError: 'cStringIO.StringI' object has no attribute '__exit__'

So, I'm guessing you can't use the 'with' statement with cStringIO
objects? Is this a bug, or do I need to use the 'with' statement
differently to get this to work?

Thanks,
peppergrower

Fredrik Lundh

unread,
Sep 27, 2008, 7:36:10 AM9/27/08
to pytho...@python.org
peppergrower wrote:

> teststring='this is a test'
>
> with cStringIO.StringIO(teststring) as testfile:
> pass

umm. what exactly do you expect that code to do?

</F>

George Boutsioukis

unread,
Sep 27, 2008, 9:31:40 AM9/27/08
to

> So, I'm guessing you can't use the 'with' statement with cStringIO
> objects? Is this a bug, or do I need to use the 'with' statement
> differently to get this to work?
>
> Thanks,
> peppergrower

Neither, just not implemented. Only classes with __enter__ and __exit__
methods(ie context manager types) can be used in with statements. And,
correct me if I'm wrong, I think it's pointless for a StringIO object to
have those.

Hrvoje Niksic

unread,
Sep 27, 2008, 11:16:01 AM9/27/08
to
George Boutsioukis <gbouts...@gmail.com> writes:

> Neither, just not implemented. Only classes with __enter__ and
> __exit__ methods(ie context manager types) can be used in with
> statements. And, correct me if I'm wrong, I think it's pointless for
> a StringIO object to have those.

It's definitely superfluous, but it should still be provided, for the
same reason a "close" method is provided, to allow StringIO objects to
be treated like other file-like objects. For example, code that does
the following:

with obj.open_file(...) as f:
...

shouldn't have to care if obj.open_file returns a built-in file
instance, or a StringIO instance. As the above code becomes more
popular, __enter__ and __exit__ are beginning to be part of the file
interface (in the duck-typing sense) and should be implemented.

Until then, the the contextlib.closing context manager can be used
instead:

with contextlib.closing(obj.open_file(...)) as f:
...

peppergrower

unread,
Sep 27, 2008, 6:28:49 PM9/27/08
to
Thanks for the help. I'm fairly new to programming (which you
probably could have guessed...). When I realized that you could use a
StringIO instance as if it were a file, I wanted to try some of the
same techniques on it as I would with a file. In this case, I wanted
to use a "for line in testfile" construction to iterate over the
StringIO instance. (I did find a better way for my particular case,
one that didn't involve StringIO at all.) When I got that particular
error, I suspected that it had something to do with the relative
newness of the 'with' statement.

If this is something that should be considered for addition in the
future, is there somewhere specific I should suggest that?

Gabriel Genellina

unread,
Sep 30, 2008, 3:32:21 AM9/30/08
to pytho...@python.org
En Sat, 27 Sep 2008 19:28:49 -0300, peppergrower
<spamcomefi...@gmail.com> escribió:

> When I got that particular
> error, I suspected that it had something to do with the relative
> newness of the 'with' statement.
>
> If this is something that should be considered for addition in the
> future, is there somewhere specific I should suggest that?

Yes: http://bugs.python.org/ (setting type="feature request", I think)

--
Gabriel Genellina

0 new messages