Connecting Tech Pros Worldwide Forums | Help | Site Map

Using the 'with' statement with cStringIO objects

peppergrower
Guest
 
Posts: n/a
#1: Sep 27 '08
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
Guest
 
Posts: n/a
#2: Sep 27 '08

re: Using the 'with' statement with cStringIO objects


peppergrower wrote:
Quote:
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
Guest
 
Posts: n/a
#3: Sep 27 '08

re: Using the 'with' statement with cStringIO objects


Quote:
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
Guest
 
Posts: n/a
#4: Sep 27 '08

re: Using the 'with' statement with cStringIO objects


George Boutsioukis <gboutsioukis@gmail.comwrites:
Quote:
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
Guest
 
Posts: n/a
#5: Sep 27 '08

re: Using the 'with' statement with cStringIO objects


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
Guest
 
Posts: n/a
#6: Sep 30 '08

re: Using the 'with' statement with cStringIO objects


En Sat, 27 Sep 2008 19:28:49 -0300, peppergrower
<spamcomefindmeplease@gmail.comescribió:
Quote:
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

Closed Thread