###
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
> teststring='this is a test'
>
> with cStringIO.StringIO(teststring) as testfile:
> pass
umm. what exactly do you expect that code to do?
</F>
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.
> 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:
...
If this is something that should be considered for addition in the
future, is there somewhere specific I should suggest that?
> 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