By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,758 Members | 1,223 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,758 IT Pros & Developers. It's quick & easy.

Using the 'with' statement with cStringIO objects

P: n/a
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
Sep 27 '08 #1
Share this Question
Share on Google+
5 Replies


P: n/a
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>

Sep 27 '08 #2

P: n/a
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.
Sep 27 '08 #3

P: n/a
George Boutsioukis <gb**********@gmail.comwrites:
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:
...
Sep 27 '08 #4

P: n/a
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?
Sep 27 '08 #5

P: n/a
En Sat, 27 Sep 2008 19:28:49 -0300, peppergrower
<sp******************@gmail.comescribió:
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

Sep 30 '08 #6

This discussion thread is closed

Replies have been disabled for this discussion.