Commit 0d5f6adb authored by Mark Dickinson's avatar Mark Dickinson

Issue #13012: Allow 'keepends' to be passed as a keyword argument in...

Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.
parent a61b053e
...@@ -200,7 +200,13 @@ class MixinBytesBufferCommonTests(object): ...@@ -200,7 +200,13 @@ class MixinBytesBufferCommonTests(object):
self.marshal(b'abc\ndef\r\nghi\n\r').splitlines()) self.marshal(b'abc\ndef\r\nghi\n\r').splitlines())
self.assertEqual([b'', b'abc', b'def', b'ghi', b''], self.assertEqual([b'', b'abc', b'def', b'ghi', b''],
self.marshal(b'\nabc\ndef\r\nghi\n\r').splitlines()) 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(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.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(keepends=True))
self.assertRaises(TypeError, self.marshal(b'abc').splitlines, 42, 42) self.assertRaises(TypeError, self.marshal(b'abc').splitlines, 42, 42)
...@@ -47,11 +47,12 @@ class BaseTest(unittest.TestCase): ...@@ -47,11 +47,12 @@ class BaseTest(unittest.TestCase):
return obj return obj
# check that obj.method(*args) returns result # 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) result = self.fixtype(result)
obj = self.fixtype(obj) obj = self.fixtype(obj)
args = self.fixtype(args) args = self.fixtype(args)
realresult = getattr(obj, methodname)(*args) kwargs = self.fixtype(kwargs)
realresult = getattr(obj, methodname)(*args, **kwargs)
self.assertEqual( self.assertEqual(
result, result,
realresult realresult
...@@ -908,7 +909,14 @@ class MixinStrUnicodeUserStringTest: ...@@ -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", 'splitlines')
self.checkequal(['abc', 'def', 'ghi', ''], "abc\ndef\r\nghi\n\r", '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(['', '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) self.checkraises(TypeError, 'abc', 'splitlines', 42, 42)
......
...@@ -17,11 +17,11 @@ class UserStringTest( ...@@ -17,11 +17,11 @@ class UserStringTest(
# Overwrite the three testing methods, because UserString # Overwrite the three testing methods, because UserString
# can't cope with arguments propagated to UserString # can't cope with arguments propagated to UserString
# (and we don't test with subclasses) # (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) result = self.fixtype(result)
object = self.fixtype(object) object = self.fixtype(object)
# we don't fix the arguments, because UserString can't cope with it # 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( self.assertEqual(
result, result,
realresult realresult
......
...@@ -10,6 +10,10 @@ What's New in Python 3.3 Alpha 1? ...@@ -10,6 +10,10 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins 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 - 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. module. Ignore the direcotry if its name matchs the module name (e.g.
"__init__.py") and raise a ImportError instead. "__init__.py") and raise a ImportError instead.
......
...@@ -2608,11 +2608,13 @@ Line breaks are not included in the resulting list unless keepends\n\ ...@@ -2608,11 +2608,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true."); is given and true.");
static PyObject* static PyObject*
bytearray_splitlines(PyObject *self, PyObject *args) bytearray_splitlines(PyObject *self, PyObject *args, PyObject *kwds)
{ {
static char *kwlist[] = {"keepends", 0};
int keepends = 0; int keepends = 0;
if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends)) if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
kwlist, &keepends))
return NULL; return NULL;
return stringlib_splitlines( return stringlib_splitlines(
...@@ -2801,8 +2803,8 @@ bytearray_methods[] = { ...@@ -2801,8 +2803,8 @@ bytearray_methods[] = {
{"rsplit", (PyCFunction)bytearray_rsplit, METH_VARARGS, rsplit__doc__}, {"rsplit", (PyCFunction)bytearray_rsplit, METH_VARARGS, rsplit__doc__},
{"rstrip", (PyCFunction)bytearray_rstrip, METH_VARARGS, rstrip__doc__}, {"rstrip", (PyCFunction)bytearray_rstrip, METH_VARARGS, rstrip__doc__},
{"split", (PyCFunction)bytearray_split, METH_VARARGS, split__doc__}, {"split", (PyCFunction)bytearray_split, METH_VARARGS, split__doc__},
{"splitlines", (PyCFunction)bytearray_splitlines, METH_VARARGS, {"splitlines", (PyCFunction)bytearray_splitlines,
splitlines__doc__}, METH_VARARGS | METH_KEYWORDS, splitlines__doc__},
{"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS , {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS ,
startswith__doc__}, startswith__doc__},
{"strip", (PyCFunction)bytearray_strip, METH_VARARGS, strip__doc__}, {"strip", (PyCFunction)bytearray_strip, METH_VARARGS, strip__doc__},
......
...@@ -2312,11 +2312,13 @@ Line breaks are not included in the resulting list unless keepends\n\ ...@@ -2312,11 +2312,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true."); is given and true.");
static PyObject* static PyObject*
bytes_splitlines(PyObject *self, PyObject *args) bytes_splitlines(PyObject *self, PyObject *args, PyObject *kwds)
{ {
static char *kwlist[] = {"keepends", 0};
int keepends = 0; int keepends = 0;
if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends)) if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
kwlist, &keepends))
return NULL; return NULL;
return stringlib_splitlines( return stringlib_splitlines(
...@@ -2458,7 +2460,7 @@ bytes_methods[] = { ...@@ -2458,7 +2460,7 @@ bytes_methods[] = {
{"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__}, {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__},
{"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__}, {"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__},
{"split", (PyCFunction)bytes_split, METH_VARARGS, split__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__}, splitlines__doc__},
{"startswith", (PyCFunction)bytes_startswith, METH_VARARGS, {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS,
startswith__doc__}, startswith__doc__},
......
...@@ -8881,11 +8881,13 @@ Line breaks are not included in the resulting list unless keepends\n\ ...@@ -8881,11 +8881,13 @@ Line breaks are not included in the resulting list unless keepends\n\
is given and true."); is given and true.");
static PyObject* static PyObject*
unicode_splitlines(PyUnicodeObject *self, PyObject *args) unicode_splitlines(PyUnicodeObject *self, PyObject *args, PyObject *kwds)
{ {
static char *kwlist[] = {"keepends", 0};
int keepends = 0; int keepends = 0;
if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends)) if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines",
kwlist, &keepends))
return NULL; return NULL;
return PyUnicode_Splitlines((PyObject *)self, keepends); return PyUnicode_Splitlines((PyObject *)self, keepends);
...@@ -9273,7 +9275,7 @@ static PyMethodDef unicode_methods[] = { ...@@ -9273,7 +9275,7 @@ static PyMethodDef unicode_methods[] = {
{"rjust", (PyCFunction) unicode_rjust, METH_VARARGS, rjust__doc__}, {"rjust", (PyCFunction) unicode_rjust, METH_VARARGS, rjust__doc__},
{"rstrip", (PyCFunction) unicode_rstrip, METH_VARARGS, rstrip__doc__}, {"rstrip", (PyCFunction) unicode_rstrip, METH_VARARGS, rstrip__doc__},
{"rpartition", (PyCFunction) unicode_rpartition, METH_O, rpartition__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__}, {"strip", (PyCFunction) unicode_strip, METH_VARARGS, strip__doc__},
{"swapcase", (PyCFunction) unicode_swapcase, METH_NOARGS, swapcase__doc__}, {"swapcase", (PyCFunction) unicode_swapcase, METH_NOARGS, swapcase__doc__},
{"translate", (PyCFunction) unicode_translate, METH_O, translate__doc__}, {"translate", (PyCFunction) unicode_translate, METH_O, translate__doc__},
......
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