Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.

This commit is contained in:
Mark Dickinson 2011-09-24 09:14:39 +01:00
parent a61b053e61
commit 0d5f6adbb3
7 changed files with 40 additions and 16 deletions

View File

@ -200,7 +200,13 @@ class MixinBytesBufferCommonTests(object):
self.marshal(b'abc\ndef\r\nghi\n\r').splitlines())
self.assertEqual([b'', b'abc', b'def', b'ghi', b''],
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines())
self.assertEqual([b'', b'abc', b'def', b'ghi', b''],
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(False))
self.assertEqual([b'\n', b'abc\n', b'def\r\n', b'ghi\n', b'\r'],
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(1))
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(True))
self.assertEqual([b'', b'abc', b'def', b'ghi', b''],
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(keepends=False))
self.assertEqual([b'\n', b'abc\n', b'def\r\n', b'ghi\n', b'\r'],
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines(keepends=True))
self.assertRaises(TypeError, self.marshal(b'abc').splitlines, 42, 42)

View File

@ -47,11 +47,12 @@ class BaseTest(unittest.TestCase):
return obj
# check that obj.method(*args) returns result
def checkequal(self, result, obj, methodname, *args):
def checkequal(self, result, obj, methodname, *args, **kwargs):
result = self.fixtype(result)
obj = self.fixtype(obj)
args = self.fixtype(args)
realresult = getattr(obj, methodname)(*args)
kwargs = self.fixtype(kwargs)
realresult = getattr(obj, methodname)(*args, **kwargs)
self.assertEqual(
result,
realresult
@ -908,7 +909,14 @@ class MixinStrUnicodeUserStringTest:
self.checkequal(['abc', 'def', 'ghi'], "abc\ndef\r\nghi\n", 'splitlines')
self.checkequal(['abc', 'def', 'ghi', ''], "abc\ndef\r\nghi\n\r", 'splitlines')
self.checkequal(['', 'abc', 'def', 'ghi', ''], "\nabc\ndef\r\nghi\n\r", 'splitlines')
self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'], "\nabc\ndef\r\nghi\n\r", 'splitlines', 1)
self.checkequal(['', 'abc', 'def', 'ghi', ''],
"\nabc\ndef\r\nghi\n\r", 'splitlines', False)
self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'],
"\nabc\ndef\r\nghi\n\r", 'splitlines', True)
self.checkequal(['', 'abc', 'def', 'ghi', ''], "\nabc\ndef\r\nghi\n\r",
'splitlines', keepends=False)
self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'],
"\nabc\ndef\r\nghi\n\r", 'splitlines', keepends=True)
self.checkraises(TypeError, 'abc', 'splitlines', 42, 42)

View File

@ -17,11 +17,11 @@ class UserStringTest(
# Overwrite the three testing methods, because UserString
# can't cope with arguments propagated to UserString
# (and we don't test with subclasses)
def checkequal(self, result, object, methodname, *args):
def checkequal(self, result, object, methodname, *args, **kwargs):
result = self.fixtype(result)
object = self.fixtype(object)
# we don't fix the arguments, because UserString can't cope with it
realresult = getattr(object, methodname)(*args)
realresult = getattr(object, methodname)(*args, **kwargs)
self.assertEqual(
result,
realresult

View File

@ -10,6 +10,10 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins
-----------------
- Issue #13012: The 'keepends' parameter to str.splitlines may now be passed
as a keyword argument: "my_string.splitlines(keepends=True)". The same
change also applies to bytes.splitlines and bytearray.splitlines.
- Issue #7732: Don't open a directory as a file anymore while importing a
module. Ignore the direcotry if its name matchs the module name (e.g.
"__init__.py") and raise a ImportError instead.

View File

@ -2608,11 +2608,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true.");
static PyObject*
bytearray_splitlines(PyObject *self, PyObject *args)
bytearray_splitlines(PyObject *self, PyObject *args, PyObject *kwds)
{
static char *kwlist[] = {"keepends", 0};
int keepends = 0;
if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends))
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
kwlist, &keepends))
return NULL;
return stringlib_splitlines(
@ -2801,8 +2803,8 @@ bytearray_methods[] = {
{"rsplit", (PyCFunction)bytearray_rsplit, METH_VARARGS, rsplit__doc__},
{"rstrip", (PyCFunction)bytearray_rstrip, METH_VARARGS, rstrip__doc__},
{"split", (PyCFunction)bytearray_split, METH_VARARGS, split__doc__},
{"splitlines", (PyCFunction)bytearray_splitlines, METH_VARARGS,
splitlines__doc__},
{"splitlines", (PyCFunction)bytearray_splitlines,
METH_VARARGS | METH_KEYWORDS, splitlines__doc__},
{"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
startswith__doc__},
{"strip", (PyCFunction)bytearray_strip, METH_VARARGS, strip__doc__},

View File

@ -2312,11 +2312,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true.");
static PyObject*
bytes_splitlines(PyObject *self, PyObject *args)
bytes_splitlines(PyObject *self, PyObject *args, PyObject *kwds)
{
static char *kwlist[] = {"keepends", 0};
int keepends = 0;
if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends))
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
kwlist, &keepends))
return NULL;
return stringlib_splitlines(
@ -2458,7 +2460,7 @@ bytes_methods[] = {
{"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__},
{"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__},
{"split", (PyCFunction)bytes_split, METH_VARARGS, split__doc__},
{"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS,
{"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS | METH_KEYWORDS,
splitlines__doc__},
{"startswith", (PyCFunction)bytes_startswith, METH_VARARGS,
startswith__doc__},

View File

@ -8881,11 +8881,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true.");
static PyObject*
unicode_splitlines(PyUnicodeObject *self, PyObject *args)
unicode_splitlines(PyUnicodeObject *self, PyObject *args, PyObject *kwds)
{
static char *kwlist[] = {"keepends", 0};
int keepends = 0;
if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends))
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
kwlist, &keepends))
return NULL;
return PyUnicode_Splitlines((PyObject *)self, keepends);
@ -9273,7 +9275,7 @@ static PyMethodDef unicode_methods[] = {
{"rjust", (PyCFunction) unicode_rjust, METH_VARARGS, rjust__doc__},
{"rstrip", (PyCFunction) unicode_rstrip, METH_VARARGS, rstrip__doc__},
{"rpartition", (PyCFunction) unicode_rpartition, METH_O, rpartition__doc__},
{"splitlines", (PyCFunction) unicode_splitlines, METH_VARARGS, splitlines__doc__},
{"splitlines", (PyCFunction) unicode_splitlines, METH_VARARGS | METH_KEYWORDS, splitlines__doc__},
{"strip", (PyCFunction) unicode_strip, METH_VARARGS, strip__doc__},
{"swapcase", (PyCFunction) unicode_swapcase, METH_NOARGS, swapcase__doc__},
{"translate", (PyCFunction) unicode_translate, METH_O, translate__doc__},