[Python-3000-checkins] r55381 - in python/branches/py3k-struni/Lib: io.py test/test_codecs.py
walter.doerwald
python-3000-checkins at python.org
Wed May 16 14:47:54 CEST 2007
Author: walter.doerwald
Date: Wed May 16 14:47:53 2007
New Revision: 55381
Modified:
python/branches/py3k-struni/Lib/io.py
python/branches/py3k-struni/Lib/test/test_codecs.py
Log:
Fix io.StringIO: String are stored encoded (using "unicode-internal" as the
encoding) which makes the buffer mutable. Strings are encoded on the way in
and decoded on the way out.
Use io.StringIO in test_codecs.py.
Fix the base64_codec test in test_codecs.py.
Modified: python/branches/py3k-struni/Lib/io.py
==============================================================================
--- python/branches/py3k-struni/Lib/io.py (original)
+++ python/branches/py3k-struni/Lib/io.py Wed May 16 14:47:53 2007
@@ -581,10 +581,10 @@
# XXX More docs
- def __init__(self, inital_bytes=None):
+ def __init__(self, initial_bytes=None):
buffer = b""
- if inital_bytes is not None:
- buffer += inital_bytes
+ if initial_bytes is not None:
+ buffer += initial_bytes
_MemoryIOMixin.__init__(self, buffer)
@@ -595,21 +595,36 @@
# XXX More docs
- # Reuses the same code as BytesIO, just with a string rather that
- # bytes as the _buffer value.
+ # Reuses the same code as BytesIO, but encode strings on the way in
+ # and decode them on the way out.
- # XXX This doesn't work; _MemoryIOMixin's write() and truncate()
- # methods assume the buffer is mutable. Simply redefining those
- # to use slice concatenation will make it awfully slow (in fact,
- # quadratic in the number of write() calls). Also, there are no
- # readline() and readlines() methods. Etc., etc.
-
- def __init__(self, inital_string=None):
- buffer = ""
- if inital_string is not None:
- buffer += inital_string
+ def __init__(self, initial_string=None):
+ if initial_string is not None:
+ buffer = initial_string.encode("unicode-internal")
+ else:
+ buffer = b""
_MemoryIOMixin.__init__(self, buffer)
+ def getvalue(self):
+ return self._buffer.encode("unicode-internal")
+
+ def read(self, n=-1):
+ return super(StringIO, self).read(n*2).decode("unicode-internal")
+
+ def write(self, s):
+ return super(StringIO, self).write(s.encode("unicode-internal"))//2
+
+ def seek(self, pos, whence=0):
+ return super(StringIO, self).seek(2*pos, whence)//2
+
+ def tell(self):
+ return super(StringIO, self).tell()//2
+
+ def truncate(self, pos=None):
+ if pos is not None:
+ pos *= 2
+ return super(StringIO, self).truncate(pos)//2
+
def readinto(self, b: bytes) -> int:
self._unsupported("readinto")
Modified: python/branches/py3k-struni/Lib/test/test_codecs.py
==============================================================================
--- python/branches/py3k-struni/Lib/test/test_codecs.py (original)
+++ python/branches/py3k-struni/Lib/test/test_codecs.py Wed May 16 14:47:53 2007
@@ -2,7 +2,6 @@
import unittest
import codecs
import sys, _testcapi, io
-from StringIO import StringIO
class Queue(object):
"""
@@ -493,7 +492,7 @@
class RecodingTest(unittest.TestCase):
def test_recoding(self):
- f = StringIO()
+ f = io.StringIO()
f2 = codecs.EncodedFile(f, "unicode_internal", "utf-8")
f2.write("a")
f2.close()
@@ -991,14 +990,14 @@
def test_read(self):
sin = "\x80".encode("base64_codec")
- reader = codecs.getreader("base64_codec")(StringIO(sin))
+ reader = codecs.getreader("base64_codec")(io.BytesIO(sin))
sout = reader.read()
self.assertEqual(sout, "\x80")
self.assert_(isinstance(sout, str))
def test_readline(self):
sin = "\x80".encode("base64_codec")
- reader = codecs.getreader("base64_codec")(StringIO(sin))
+ reader = codecs.getreader("base64_codec")(io.BytesIO(sin))
sout = reader.readline()
self.assertEqual(sout, "\x80")
self.assert_(isinstance(sout, str))
More information about the Python-3000-checkins
mailing list