[Python-checkins] r70033 - in python/branches/io-c: Lib/_pyio.py Lib/io.py Lib/test/test_io.py Modules/_bufferedio.c Modules/_bytesio.c Modules/_fileio.c Modules/_iobase.c Modules/_stringio.c Modules/_textio.c Modules/io.c
antoine.pitrou
python-checkins at python.org
Fri Feb 27 22:49:51 CET 2009
Author: antoine.pitrou
Date: Fri Feb 27 22:49:50 2009
New Revision: 70033
Log:
The base classes now are ABCs.
Modified:
python/branches/io-c/Lib/_pyio.py
python/branches/io-c/Lib/io.py
python/branches/io-c/Lib/test/test_io.py
python/branches/io-c/Modules/_bufferedio.c
python/branches/io-c/Modules/_bytesio.c
python/branches/io-c/Modules/_fileio.c
python/branches/io-c/Modules/_iobase.c
python/branches/io-c/Modules/_stringio.c
python/branches/io-c/Modules/_textio.c
python/branches/io-c/Modules/io.c
Modified: python/branches/io-c/Lib/_pyio.py
==============================================================================
--- python/branches/io-c/Lib/_pyio.py (original)
+++ python/branches/io-c/Lib/_pyio.py Fri Feb 27 22:49:50 2009
@@ -5,18 +5,22 @@
import os
import abc
import codecs
-#import _fileio
# Import _thread instead of threading to reduce startup cost
try:
from _thread import allocate_lock as Lock
except ImportError:
from _dummy_thread import allocate_lock as Lock
+import io
from io import __all__
# open() uses st_blksize whenever we can
DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
+# NOTE: Base classes defined here are registered with the "official" ABCs
+# defined in io.py. We don't use real inheritance though, because we don't
+# want to inherit the C implementations.
+
class BlockingIOError(IOError):
@@ -496,6 +500,8 @@
for line in lines:
self.write(line)
+io.IOBase.register(IOBase)
+
class RawIOBase(IOBase):
@@ -551,7 +557,7 @@
"""
self._unsupported("write")
-
+io.RawIOBase.register(RawIOBase)
from _io import FileIO
RawIOBase.register(FileIO)
@@ -627,6 +633,8 @@
"""
self._unsupported("write")
+io.BufferedIOBase.register(BufferedIOBase)
+
class _BufferedIOMixin(BufferedIOBase):
@@ -1218,6 +1226,8 @@
"""
return None
+io.TextIOBase.register(TextIOBase)
+
class IncrementalNewlineDecoder(codecs.IncrementalDecoder):
r"""Codec used when reading a file in universal newlines mode. It wraps
Modified: python/branches/io-c/Lib/io.py
==============================================================================
--- python/branches/io-c/Lib/io.py (original)
+++ python/branches/io-c/Lib/io.py Fri Feb 27 22:49:50 2009
@@ -54,24 +54,47 @@
import _io
+import abc
+# open() uses st_blksize whenever we can
DEFAULT_BUFFER_SIZE = _io.DEFAULT_BUFFER_SIZE
BlockingIOError = _io.BlockingIOError
UnsupportedOperation = _io.UnsupportedOperation
open = _io.open
OpenWrapper = _io.open
-IOBase = _io.IOBase
-RawIOBase = _io.RawIOBase
+
+# Declaring ABCs in C is tricky so we do it here.
+# Method descriptions and default implementations are inherited from the C
+# version however.
+class IOBase(_io._IOBase, metaclass=abc.ABCMeta):
+ pass
+
+class RawIOBase(_io._RawIOBase, IOBase):
+ pass
+
+class BufferedIOBase(_io._BufferedIOBase, IOBase):
+ pass
+
+class TextIOBase(_io._TextIOBase, IOBase):
+ pass
+
FileIO = _io.FileIO
-BufferedIOBase = _io.BufferedIOBase
BytesIO = _io.BytesIO
StringIO = _io.StringIO
BufferedReader = _io.BufferedReader
BufferedWriter = _io.BufferedWriter
BufferedRWPair = _io.BufferedRWPair
BufferedRandom = _io.BufferedRandom
-TextIOBase = _io.TextIOBase
IncrementalNewlineDecoder = _io.IncrementalNewlineDecoder
TextIOWrapper = _io.TextIOWrapper
-# open() uses st_blksize whenever we can
-DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
+
+RawIOBase.register(FileIO)
+
+BufferedIOBase.register(BytesIO)
+BufferedIOBase.register(BufferedReader)
+BufferedIOBase.register(BufferedWriter)
+BufferedIOBase.register(BufferedRandom)
+BufferedIOBase.register(BufferedRWPair)
+
+TextIOBase.register(StringIO)
+TextIOBase.register(TextIOWrapper)
Modified: python/branches/io-c/Lib/test/test_io.py
==============================================================================
--- python/branches/io-c/Lib/test/test_io.py (original)
+++ python/branches/io-c/Lib/test/test_io.py Fri Feb 27 22:49:50 2009
@@ -28,6 +28,7 @@
import unittest
import weakref
import gc
+import abc
from itertools import chain, cycle, count
from collections import deque
from test import support
@@ -2043,23 +2044,38 @@
gc.collect()
self.assert_(wr() is None, wr)
- def test_abc_inheritance(self):
- # Test implementations inherit (even virtually) from their respective ABCs
+ def test_abcs(self):
+ # Test the visible base classes are ABCs.
+ self.assertTrue(isinstance(self.IOBase, abc.ABCMeta))
+ self.assertTrue(isinstance(self.RawIOBase, abc.ABCMeta))
+ self.assertTrue(isinstance(self.BufferedIOBase, abc.ABCMeta))
+ self.assertTrue(isinstance(self.TextIOBase, abc.ABCMeta))
+
+ def _check_abc_inheritance(self, abcmodule):
f = self.open(support.TESTFN, "wb", buffering=0)
- self.assertTrue(isinstance(f, self.IOBase))
- self.assertTrue(isinstance(f, self.RawIOBase))
- self.assertFalse(isinstance(f, self.BufferedIOBase))
- self.assertFalse(isinstance(f, self.TextIOBase))
+ self.assertTrue(isinstance(f, abcmodule.IOBase))
+ self.assertTrue(isinstance(f, abcmodule.RawIOBase))
+ self.assertFalse(isinstance(f, abcmodule.BufferedIOBase))
+ self.assertFalse(isinstance(f, abcmodule.TextIOBase))
f = self.open(support.TESTFN, "wb")
- self.assertTrue(isinstance(f, self.IOBase))
- self.assertFalse(isinstance(f, self.RawIOBase))
- self.assertTrue(isinstance(f, self.BufferedIOBase))
- self.assertFalse(isinstance(f, self.TextIOBase))
+ self.assertTrue(isinstance(f, abcmodule.IOBase))
+ self.assertFalse(isinstance(f, abcmodule.RawIOBase))
+ self.assertTrue(isinstance(f, abcmodule.BufferedIOBase))
+ self.assertFalse(isinstance(f, abcmodule.TextIOBase))
f = self.open(support.TESTFN, "w")
- self.assertTrue(isinstance(f, self.IOBase))
- self.assertFalse(isinstance(f, self.RawIOBase))
- self.assertFalse(isinstance(f, self.BufferedIOBase))
- self.assertTrue(isinstance(f, self.TextIOBase))
+ self.assertTrue(isinstance(f, abcmodule.IOBase))
+ self.assertFalse(isinstance(f, abcmodule.RawIOBase))
+ self.assertFalse(isinstance(f, abcmodule.BufferedIOBase))
+ self.assertTrue(isinstance(f, abcmodule.TextIOBase))
+
+ def test_abc_inheritance(self):
+ # Test implementations inherit from their respective ABCs
+ self._check_abc_inheritance(self)
+
+ def test_abc_inheritance_official(self):
+ # Test implementations inherit from the official ABCs of the
+ # baseline "io" module.
+ self._check_abc_inheritance(io)
class CMiscIOTest(MiscIOTest):
io = io
Modified: python/branches/io-c/Modules/_bufferedio.c
==============================================================================
--- python/branches/io-c/Modules/_bufferedio.c (original)
+++ python/branches/io-c/Modules/_bufferedio.c Fri Feb 27 22:49:50 2009
@@ -136,7 +136,7 @@
PyTypeObject PyBufferedIOBase_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "BufferedIOBase", /*tp_name*/
+ "_io._BufferedIOBase", /*tp_name*/
0, /*tp_basicsize*/
0, /*tp_itemsize*/
0, /*tp_dealloc*/
@@ -1374,7 +1374,7 @@
PyTypeObject PyBufferedReader_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "BufferedReader", /*tp_name*/
+ "_io.BufferedReader", /*tp_name*/
sizeof(BufferedObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)BufferedObject_dealloc, /*tp_dealloc*/
@@ -1712,7 +1712,7 @@
PyTypeObject PyBufferedWriter_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "BufferedWriter", /*tp_name*/
+ "_io.BufferedWriter", /*tp_name*/
sizeof(BufferedObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)BufferedObject_dealloc, /*tp_dealloc*/
@@ -1957,8 +1957,8 @@
PyTypeObject PyBufferedRWPair_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "BufferedRWPair", /*tp_name*/
- sizeof(BufferedRWPairObject), /*tp_basicsize*/
+ "_io.BufferedRWPair", /*tp_name*/
+ sizeof(BufferedRWPairObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)BufferedRWPair_dealloc, /*tp_dealloc*/
0, /*tp_print*/
@@ -2088,7 +2088,7 @@
PyTypeObject PyBufferedRandom_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "BufferedRandom", /*tp_name*/
+ "_io.BufferedRandom", /*tp_name*/
sizeof(BufferedObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)BufferedObject_dealloc, /*tp_dealloc*/
Modified: python/branches/io-c/Modules/_bytesio.c
==============================================================================
--- python/branches/io-c/Modules/_bytesio.c (original)
+++ python/branches/io-c/Modules/_bytesio.c Fri Feb 27 22:49:50 2009
@@ -716,7 +716,7 @@
PyTypeObject PyBytesIO_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "_bytesio._BytesIO", /*tp_name*/
+ "_io.BytesIO", /*tp_name*/
sizeof(BytesIOObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)bytesio_dealloc, /*tp_dealloc*/
Modified: python/branches/io-c/Modules/_fileio.c
==============================================================================
--- python/branches/io-c/Modules/_fileio.c (original)
+++ python/branches/io-c/Modules/_fileio.c Fri Feb 27 22:49:50 2009
@@ -956,7 +956,7 @@
PyTypeObject PyFileIO_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "FileIO",
+ "_io.FileIO",
sizeof(PyFileIOObject),
0,
(destructor)fileio_dealloc, /* tp_dealloc */
Modified: python/branches/io-c/Modules/_iobase.c
==============================================================================
--- python/branches/io-c/Modules/_iobase.c (original)
+++ python/branches/io-c/Modules/_iobase.c Fri Feb 27 22:49:50 2009
@@ -706,7 +706,7 @@
PyTypeObject PyIOBase_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "IOBase", /*tp_name*/
+ "_io._IOBase", /*tp_name*/
sizeof(IOBaseObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)IOBase_dealloc, /*tp_dealloc*/
@@ -862,7 +862,7 @@
PyTypeObject PyRawIOBase_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "RawIOBase", /*tp_name*/
+ "_io._RawIOBase", /*tp_name*/
0, /*tp_basicsize*/
0, /*tp_itemsize*/
0, /*tp_dealloc*/
Modified: python/branches/io-c/Modules/_stringio.c
==============================================================================
--- python/branches/io-c/Modules/_stringio.c (original)
+++ python/branches/io-c/Modules/_stringio.c Fri Feb 27 22:49:50 2009
@@ -728,7 +728,7 @@
PyTypeObject PyStringIO_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "StringIO", /*tp_name*/
+ "_io.StringIO", /*tp_name*/
sizeof(StringIOObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)stringio_dealloc, /*tp_dealloc*/
Modified: python/branches/io-c/Modules/_textio.c
==============================================================================
--- python/branches/io-c/Modules/_textio.c (original)
+++ python/branches/io-c/Modules/_textio.c Fri Feb 27 22:49:50 2009
@@ -107,7 +107,7 @@
PyTypeObject PyTextIOBase_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "TextIOBase", /*tp_name*/
+ "_io._TextIOBase", /*tp_name*/
0, /*tp_basicsize*/
0, /*tp_itemsize*/
0, /*tp_dealloc*/
@@ -526,7 +526,7 @@
PyTypeObject PyIncrementalNewlineDecoder_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "IncrementalNewlineDecoder", /*tp_name*/
+ "_io.IncrementalNewlineDecoder", /*tp_name*/
sizeof(PyNewLineDecoderObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)IncrementalNewlineDecoder_dealloc, /*tp_dealloc*/
@@ -2348,7 +2348,7 @@
PyTypeObject PyTextIOWrapper_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "TextIOWrapper", /*tp_name*/
+ "_io.TextIOWrapper", /*tp_name*/
sizeof(PyTextIOWrapperObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)TextIOWrapper_dealloc, /*tp_dealloc*/
Modified: python/branches/io-c/Modules/io.c
==============================================================================
--- python/branches/io-c/Modules/io.c (original)
+++ python/branches/io-c/Modules/io.c Fri Feb 27 22:49:50 2009
@@ -653,18 +653,15 @@
_PyExc_BlockingIOError.tp_base = (PyTypeObject *) PyExc_IOError;
ADD_TYPE(&_PyExc_BlockingIOError, "BlockingIOError");
- /* IOBase */
- ADD_TYPE(&PyIOBase_Type, "IOBase");
-
- /* RawIOBase */
- ADD_TYPE(&PyRawIOBase_Type, "RawIOBase");
-
- /* BufferedIOBase */
- ADD_TYPE(&PyBufferedIOBase_Type, "BufferedIOBase");
-
- /* TextIOBase */
- ADD_TYPE(&PyTextIOBase_Type,"TextIOBase");
+ /* Concrete base types of the IO ABCs.
+ (the ABCs themselves are declared through inheritance in io.py)
+ */
+ ADD_TYPE(&PyIOBase_Type, "_IOBase");
+ ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");
+ ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");
+ ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");
+ /* Implementation of concrete IO objects. */
/* FileIO */
PyFileIO_Type.tp_base = &PyRawIOBase_Type;
ADD_TYPE(&PyFileIO_Type, "FileIO");
More information about the Python-checkins
mailing list