mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #13012: Allow 'keepends' to be passed as a keyword argument in str.splitlines, bytes.splitlines and bytearray.splitlines.
This commit is contained in:
parent
a61b053e61
commit
0d5f6adbb3
7 changed files with 40 additions and 16 deletions
|
@ -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.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)
|
self.assertRaises(TypeError, self.marshal(b'abc').splitlines, 42, 42)
|
||||||
|
|
|
@ -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:
|
||||||
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(
|
||||||
# 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?
|
||||||
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\
|
||||||
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[] = {
|
||||||
{"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\
|
||||||
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[] = {
|
||||||
{"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\
|
||||||
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[] = {
|
||||||
{"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__},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue