Kaydet (Commit) 0926ad1f authored tarafından Benjamin Peterson's avatar Benjamin Peterson

give the C implementation of TextIOWrapper the errors property #6217

üst 3bbbf18a
...@@ -600,6 +600,10 @@ Text I/O ...@@ -600,6 +600,10 @@ Text I/O
The name of the encoding used to decode the stream's bytes into The name of the encoding used to decode the stream's bytes into
strings, and to encode strings into bytes. strings, and to encode strings into bytes.
.. attribute:: errors
The error setting of the decoder or encoder.
.. attribute:: newlines .. attribute:: newlines
A string, a tuple of strings, or ``None``, indicating the newlines A string, a tuple of strings, or ``None``, indicating the newlines
...@@ -665,13 +669,9 @@ Text I/O ...@@ -665,13 +669,9 @@ Text I/O
If *line_buffering* is ``True``, :meth:`flush` is implied when a call to If *line_buffering* is ``True``, :meth:`flush` is implied when a call to
write contains a newline character. write contains a newline character.
:class:`TextIOWrapper` provides these data attributes in addition to those of :class:`TextIOWrapper` provides one attribute in addition to those of
:class:`TextIOBase` and its parents: :class:`TextIOBase` and its parents:
.. attribute:: errors
The encoding and decoding error setting.
.. attribute:: line_buffering .. attribute:: line_buffering
Whether line buffering is enabled. Whether line buffering is enabled.
......
...@@ -1286,6 +1286,13 @@ class TextIOBase(IOBase): ...@@ -1286,6 +1286,13 @@ class TextIOBase(IOBase):
""" """
return None return None
@property
def errors(self):
"""Error setting of the decoder or encoder.
Subclasses should override."""
return None
io.TextIOBase.register(TextIOBase) io.TextIOBase.register(TextIOBase)
...@@ -1932,6 +1939,10 @@ class StringIO(TextIOWrapper): ...@@ -1932,6 +1939,10 @@ class StringIO(TextIOWrapper):
# that's a implementation detail. # that's a implementation detail.
return object.__repr__(self) return object.__repr__(self)
@property
def errors(self):
return None
@property @property
def encoding(self): def encoding(self):
return None return None
......
...@@ -2024,6 +2024,12 @@ class TextIOWrapperTest(unittest.TestCase): ...@@ -2024,6 +2024,12 @@ class TextIOWrapperTest(unittest.TestCase):
with self.open(filename, 'rb') as f: with self.open(filename, 'rb') as f:
self.assertEquals(f.read(), 'bbbzzz'.encode(charset)) self.assertEquals(f.read(), 'bbbzzz'.encode(charset))
def test_errors_property(self):
with self.open(support.TESTFN, "w") as f:
self.assertEqual(f.errors, "strict")
with self.open(support.TESTFN, "w", errors="replace") as f:
self.assertEqual(f.errors, "replace")
class CTextIOWrapperTest(TextIOWrapperTest): class CTextIOWrapperTest(TextIOWrapperTest):
......
...@@ -459,9 +459,9 @@ class PyStringIOTest(MemoryTestMixin, MemorySeekTestMixin, unittest.TestCase): ...@@ -459,9 +459,9 @@ class PyStringIOTest(MemoryTestMixin, MemorySeekTestMixin, unittest.TestCase):
# These are just dummy values but we nevertheless check them for fear # These are just dummy values but we nevertheless check them for fear
# of unexpected breakage. # of unexpected breakage.
self.assertTrue(memio.encoding is None) self.assertIsNone(memio.encoding)
self.assertEqual(memio.errors, "strict") self.assertIsNone(memio.errors)
self.assertEqual(memio.line_buffering, False) self.assertFalse(memio.line_buffering)
def test_newline_none(self): def test_newline_none(self):
# newline=None # newline=None
......
...@@ -21,6 +21,10 @@ Core and Builtins ...@@ -21,6 +21,10 @@ Core and Builtins
Library Library
------- -------
- Issue #6217: The C implementation of io.TextIOWrapper didn't include the
errors property. Additionally, the errors and encoding properties of StringIO
are always None now.
- Issue #6137: The pickle module now translates module names when loading - Issue #6137: The pickle module now translates module names when loading
or dumping pickles with a 2.x-compatible protocol, in order to make data or dumping pickles with a 2.x-compatible protocol, in order to make data
sharing and migration easier. This behaviour can be disabled using the sharing and migration easier. This behaviour can be disabled using the
......
...@@ -660,22 +660,6 @@ stringio_closed(StringIOObject *self, void *context) ...@@ -660,22 +660,6 @@ stringio_closed(StringIOObject *self, void *context)
return PyBool_FromLong(self->closed); return PyBool_FromLong(self->closed);
} }
static PyObject *
stringio_encoding(StringIOObject *self, void *context)
{
CHECK_INITIALIZED(self);
CHECK_CLOSED(self);
Py_RETURN_NONE;
}
static PyObject *
stringio_errors(StringIOObject *self, void *context)
{
CHECK_INITIALIZED(self);
CHECK_CLOSED(self);
return PyUnicode_FromString("strict");
}
static PyObject * static PyObject *
stringio_line_buffering(StringIOObject *self, void *context) stringio_line_buffering(StringIOObject *self, void *context)
{ {
...@@ -720,8 +704,6 @@ static PyGetSetDef stringio_getset[] = { ...@@ -720,8 +704,6 @@ static PyGetSetDef stringio_getset[] = {
will be found. will be found.
*/ */
{"buffer", (getter)stringio_buffer, NULL, NULL}, {"buffer", (getter)stringio_buffer, NULL, NULL},
{"encoding", (getter)stringio_encoding, NULL, NULL},
{"errors", (getter)stringio_errors, NULL, NULL},
{"line_buffering", (getter)stringio_line_buffering, NULL, NULL}, {"line_buffering", (getter)stringio_line_buffering, NULL, NULL},
{NULL} {NULL}
}; };
......
...@@ -104,6 +104,18 @@ TextIOBase_newlines_get(PyObject *self, void *context) ...@@ -104,6 +104,18 @@ TextIOBase_newlines_get(PyObject *self, void *context)
Py_RETURN_NONE; Py_RETURN_NONE;
} }
PyDoc_STRVAR(TextIOBase_errors_doc,
"The error setting of the decoder or encoder.\n"
"\n"
"Subclasses should override.\n"
);
static PyObject *
TextIOBase_errors_get(PyObject *self, void *context)
{
Py_RETURN_NONE;
}
static PyMethodDef TextIOBase_methods[] = { static PyMethodDef TextIOBase_methods[] = {
{"detach", (PyCFunction)TextIOBase_detach, METH_NOARGS, TextIOBase_detach_doc}, {"detach", (PyCFunction)TextIOBase_detach, METH_NOARGS, TextIOBase_detach_doc},
...@@ -116,6 +128,7 @@ static PyMethodDef TextIOBase_methods[] = { ...@@ -116,6 +128,7 @@ static PyMethodDef TextIOBase_methods[] = {
static PyGetSetDef TextIOBase_getset[] = { static PyGetSetDef TextIOBase_getset[] = {
{"encoding", (getter)TextIOBase_encoding_get, NULL, TextIOBase_encoding_doc}, {"encoding", (getter)TextIOBase_encoding_get, NULL, TextIOBase_encoding_doc},
{"newlines", (getter)TextIOBase_newlines_get, NULL, TextIOBase_newlines_doc}, {"newlines", (getter)TextIOBase_newlines_get, NULL, TextIOBase_newlines_doc},
{"errors", (getter)TextIOBase_errors_get, NULL, TextIOBase_errors_doc},
{NULL} {NULL}
}; };
...@@ -2461,6 +2474,13 @@ TextIOWrapper_newlines_get(PyTextIOWrapperObject *self, void *context) ...@@ -2461,6 +2474,13 @@ TextIOWrapper_newlines_get(PyTextIOWrapperObject *self, void *context)
return res; return res;
} }
static PyObject *
TextIOWrapper_errors_get(PyTextIOWrapperObject *self, void *context)
{
CHECK_INITIALIZED(self);
return PyUnicode_FromString(PyBytes_AS_STRING(self->errors));
}
static PyObject * static PyObject *
TextIOWrapper_chunk_size_get(PyTextIOWrapperObject *self, void *context) TextIOWrapper_chunk_size_get(PyTextIOWrapperObject *self, void *context)
{ {
...@@ -2519,6 +2539,7 @@ static PyGetSetDef TextIOWrapper_getset[] = { ...@@ -2519,6 +2539,7 @@ static PyGetSetDef TextIOWrapper_getset[] = {
/* {"mode", (getter)TextIOWrapper_mode_get, NULL, NULL}, /* {"mode", (getter)TextIOWrapper_mode_get, NULL, NULL},
*/ */
{"newlines", (getter)TextIOWrapper_newlines_get, NULL, NULL}, {"newlines", (getter)TextIOWrapper_newlines_get, NULL, NULL},
{"errors", (getter)TextIOWrapper_errors_get, NULL, NULL},
{"_CHUNK_SIZE", (getter)TextIOWrapper_chunk_size_get, {"_CHUNK_SIZE", (getter)TextIOWrapper_chunk_size_get,
(setter)TextIOWrapper_chunk_size_set, NULL}, (setter)TextIOWrapper_chunk_size_set, NULL},
{NULL} {NULL}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment