summaryrefslogtreecommitdiffstats
path: root/Objects/clinic
diff options
context:
space:
mode:
authorsweeneyde <36520290+sweeneyde@users.noreply.github.com>2020-04-22 21:05:48 (GMT)
committerGitHub <noreply@github.com>2020-04-22 21:05:48 (GMT)
commita81849b0315277bb3937271174aaaa5059c0b445 (patch)
tree8184e6ab012aa217b5cc1bb242efc6aed531db7d /Objects/clinic
parent39652cd8bdf7c82b7c6055089a4ed90ee546a448 (diff)
downloadcpython-a81849b0315277bb3937271174aaaa5059c0b445.zip
cpython-a81849b0315277bb3937271174aaaa5059c0b445.tar.gz
cpython-a81849b0315277bb3937271174aaaa5059c0b445.tar.bz2
bpo-39939: Add str.removeprefix and str.removesuffix (GH-18939)
Added str.removeprefix and str.removesuffix methods and corresponding bytes, bytearray, and collections.UserString methods to remove affixes from a string if present. See PEP 616 for a full description.
Diffstat (limited to 'Objects/clinic')
-rw-r--r--Objects/clinic/bytearrayobject.c.h82
-rw-r--r--Objects/clinic/bytesobject.c.h81
-rw-r--r--Objects/clinic/unicodeobject.c.h73
3 files changed, 233 insertions, 3 deletions
diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h
index 0557707..35ba1ff 100644
--- a/Objects/clinic/bytearrayobject.c.h
+++ b/Objects/clinic/bytearrayobject.c.h
@@ -38,6 +38,86 @@ bytearray_copy(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
return bytearray_copy_impl(self);
}
+PyDoc_STRVAR(bytearray_removeprefix__doc__,
+"removeprefix($self, prefix, /)\n"
+"--\n"
+"\n"
+"Return a bytearray with the given prefix string removed if present.\n"
+"\n"
+"If the bytearray starts with the prefix string, return\n"
+"bytearray[len(prefix):]. Otherwise, return a copy of the original\n"
+"bytearray.");
+
+#define BYTEARRAY_REMOVEPREFIX_METHODDEF \
+ {"removeprefix", (PyCFunction)bytearray_removeprefix, METH_O, bytearray_removeprefix__doc__},
+
+static PyObject *
+bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix);
+
+static PyObject *
+bytearray_removeprefix(PyByteArrayObject *self, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ Py_buffer prefix = {NULL, NULL};
+
+ if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) {
+ goto exit;
+ }
+ if (!PyBuffer_IsContiguous(&prefix, 'C')) {
+ _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg);
+ goto exit;
+ }
+ return_value = bytearray_removeprefix_impl(self, &prefix);
+
+exit:
+ /* Cleanup for prefix */
+ if (prefix.obj) {
+ PyBuffer_Release(&prefix);
+ }
+
+ return return_value;
+}
+
+PyDoc_STRVAR(bytearray_removesuffix__doc__,
+"removesuffix($self, suffix, /)\n"
+"--\n"
+"\n"
+"Return a bytearray with the given suffix string removed if present.\n"
+"\n"
+"If the bytearray ends with the suffix string and that suffix is not\n"
+"empty, return bytearray[:-len(suffix)]. Otherwise, return a copy of\n"
+"the original bytearray.");
+
+#define BYTEARRAY_REMOVESUFFIX_METHODDEF \
+ {"removesuffix", (PyCFunction)bytearray_removesuffix, METH_O, bytearray_removesuffix__doc__},
+
+static PyObject *
+bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix);
+
+static PyObject *
+bytearray_removesuffix(PyByteArrayObject *self, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ Py_buffer suffix = {NULL, NULL};
+
+ if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) {
+ goto exit;
+ }
+ if (!PyBuffer_IsContiguous(&suffix, 'C')) {
+ _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg);
+ goto exit;
+ }
+ return_value = bytearray_removesuffix_impl(self, &suffix);
+
+exit:
+ /* Cleanup for suffix */
+ if (suffix.obj) {
+ PyBuffer_Release(&suffix);
+ }
+
+ return return_value;
+}
+
PyDoc_STRVAR(bytearray_translate__doc__,
"translate($self, table, /, delete=b\'\')\n"
"--\n"
@@ -1011,4 +1091,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
{
return bytearray_sizeof_impl(self);
}
-/*[clinic end generated code: output=508dce79cf2dffcc input=a9049054013a1b77]*/
+/*[clinic end generated code: output=b2919f76709e48dc input=a9049054013a1b77]*/
diff --git a/Objects/clinic/bytesobject.c.h b/Objects/clinic/bytesobject.c.h
index 22024ab..063a377 100644
--- a/Objects/clinic/bytesobject.c.h
+++ b/Objects/clinic/bytesobject.c.h
@@ -526,6 +526,85 @@ exit:
return return_value;
}
+PyDoc_STRVAR(bytes_removeprefix__doc__,
+"removeprefix($self, prefix, /)\n"
+"--\n"
+"\n"
+"Return a bytes object with the given prefix string removed if present.\n"
+"\n"
+"If the bytes starts with the prefix string, return bytes[len(prefix):].\n"
+"Otherwise, return a copy of the original bytes.");
+
+#define BYTES_REMOVEPREFIX_METHODDEF \
+ {"removeprefix", (PyCFunction)bytes_removeprefix, METH_O, bytes_removeprefix__doc__},
+
+static PyObject *
+bytes_removeprefix_impl(PyBytesObject *self, Py_buffer *prefix);
+
+static PyObject *
+bytes_removeprefix(PyBytesObject *self, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ Py_buffer prefix = {NULL, NULL};
+
+ if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) {
+ goto exit;
+ }
+ if (!PyBuffer_IsContiguous(&prefix, 'C')) {
+ _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg);
+ goto exit;
+ }
+ return_value = bytes_removeprefix_impl(self, &prefix);
+
+exit:
+ /* Cleanup for prefix */
+ if (prefix.obj) {
+ PyBuffer_Release(&prefix);
+ }
+
+ return return_value;
+}
+
+PyDoc_STRVAR(bytes_removesuffix__doc__,
+"removesuffix($self, suffix, /)\n"
+"--\n"
+"\n"
+"Return a bytes object with the given suffix string removed if present.\n"
+"\n"
+"If the bytes ends with the suffix string and that suffix is not empty,\n"
+"return bytes[:-len(prefix)]. Otherwise, return a copy of the original\n"
+"bytes.");
+
+#define BYTES_REMOVESUFFIX_METHODDEF \
+ {"removesuffix", (PyCFunction)bytes_removesuffix, METH_O, bytes_removesuffix__doc__},
+
+static PyObject *
+bytes_removesuffix_impl(PyBytesObject *self, Py_buffer *suffix);
+
+static PyObject *
+bytes_removesuffix(PyBytesObject *self, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ Py_buffer suffix = {NULL, NULL};
+
+ if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) {
+ goto exit;
+ }
+ if (!PyBuffer_IsContiguous(&suffix, 'C')) {
+ _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg);
+ goto exit;
+ }
+ return_value = bytes_removesuffix_impl(self, &suffix);
+
+exit:
+ /* Cleanup for suffix */
+ if (suffix.obj) {
+ PyBuffer_Release(&suffix);
+ }
+
+ return return_value;
+}
+
PyDoc_STRVAR(bytes_decode__doc__,
"decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n"
"--\n"
@@ -755,4 +834,4 @@ skip_optional_pos:
exit:
return return_value;
}
-/*[clinic end generated code: output=ca60dfccf8d51e88 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=220388917d7bf751 input=a9049054013a1b77]*/
diff --git a/Objects/clinic/unicodeobject.c.h b/Objects/clinic/unicodeobject.c.h
index 0d13406..cf81df4 100644
--- a/Objects/clinic/unicodeobject.c.h
+++ b/Objects/clinic/unicodeobject.c.h
@@ -754,6 +754,77 @@ exit:
return return_value;
}
+PyDoc_STRVAR(unicode_removeprefix__doc__,
+"removeprefix($self, prefix, /)\n"
+"--\n"
+"\n"
+"Return a str with the given prefix string removed if present.\n"
+"\n"
+"If the string starts with the prefix string, return string[len(prefix):].\n"
+"Otherwise, return a copy of the original string.");
+
+#define UNICODE_REMOVEPREFIX_METHODDEF \
+ {"removeprefix", (PyCFunction)unicode_removeprefix, METH_O, unicode_removeprefix__doc__},
+
+static PyObject *
+unicode_removeprefix_impl(PyObject *self, PyObject *prefix);
+
+static PyObject *
+unicode_removeprefix(PyObject *self, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ PyObject *prefix;
+
+ if (!PyUnicode_Check(arg)) {
+ _PyArg_BadArgument("removeprefix", "argument", "str", arg);
+ goto exit;
+ }
+ if (PyUnicode_READY(arg) == -1) {
+ goto exit;
+ }
+ prefix = arg;
+ return_value = unicode_removeprefix_impl(self, prefix);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(unicode_removesuffix__doc__,
+"removesuffix($self, suffix, /)\n"
+"--\n"
+"\n"
+"Return a str with the given suffix string removed if present.\n"
+"\n"
+"If the string ends with the suffix string and that suffix is not empty,\n"
+"return string[:-len(suffix)]. Otherwise, return a copy of the original\n"
+"string.");
+
+#define UNICODE_REMOVESUFFIX_METHODDEF \
+ {"removesuffix", (PyCFunction)unicode_removesuffix, METH_O, unicode_removesuffix__doc__},
+
+static PyObject *
+unicode_removesuffix_impl(PyObject *self, PyObject *suffix);
+
+static PyObject *
+unicode_removesuffix(PyObject *self, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ PyObject *suffix;
+
+ if (!PyUnicode_Check(arg)) {
+ _PyArg_BadArgument("removesuffix", "argument", "str", arg);
+ goto exit;
+ }
+ if (PyUnicode_READY(arg) == -1) {
+ goto exit;
+ }
+ suffix = arg;
+ return_value = unicode_removesuffix_impl(self, suffix);
+
+exit:
+ return return_value;
+}
+
PyDoc_STRVAR(unicode_rjust__doc__,
"rjust($self, width, fillchar=\' \', /)\n"
"--\n"
@@ -1232,4 +1303,4 @@ unicode_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored))
{
return unicode_sizeof_impl(self);
}
-/*[clinic end generated code: output=e4ed33400979c7e8 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=b91233f3722643be input=a9049054013a1b77]*/