]> granicus.if.org Git - python/commitdiff
Issue #24284: The startswith and endswith methods of the str class no longer
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 31 May 2015 06:15:51 +0000 (09:15 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 31 May 2015 06:15:51 +0000 (09:15 +0300)
return True when finding the empty string and the indexes are completely out
of range.

Doc/whatsnew/3.5.rst
Lib/test/string_tests.py
Misc/NEWS
Objects/unicodeobject.c

index c39d975f871bb51aea69e9af2d67043ceb940ed4..ee0e5d12bf1eebfe809b87124529bf16cfda4b6f 100644 (file)
@@ -1049,6 +1049,10 @@ Changes in the Python API
   program depends on patching the module level variable to capture the debug
   output, you will need to update it to capture sys.stderr instead.
 
+* The :meth:`str.startswith` and :meth:`str.endswith` methods no longer return
+  ``True`` when finding the empty string and the indexes are completely out of
+  range.  See :issue:`24284`.
+
 Changes in the C API
 --------------------
 
index 6e26474a3b3da49d95f8bd4c2f4bb15b05332a8f..e086994b0b64ed951040948e5eff5a51e4ad2b1a 100644 (file)
@@ -976,6 +976,9 @@ class MixinStrUnicodeUserStringTest:
         self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3)
         self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3, 7)
         self.checkequal(False, 'helloworld', 'startswith', 'lowo', 3, 6)
+        self.checkequal(True, '', 'startswith', '', 0, 1)
+        self.checkequal(True, '', 'startswith', '', 0, 0)
+        self.checkequal(False, '', 'startswith', '', 1, 0)
 
         # test negative indices
         self.checkequal(True, 'hello', 'startswith', 'he', 0, -1)
@@ -1022,6 +1025,9 @@ class MixinStrUnicodeUserStringTest:
         self.checkequal(False, 'helloworld', 'endswith', 'lowo', 3, 8)
         self.checkequal(False, 'ab', 'endswith', 'ab', 0, 1)
         self.checkequal(False, 'ab', 'endswith', 'ab', 0, 0)
+        self.checkequal(True, '', 'endswith', '', 0, 1)
+        self.checkequal(True, '', 'endswith', '', 0, 0)
+        self.checkequal(False, '', 'endswith', '', 1, 0)
 
         # test negative indices
         self.checkequal(True, 'hello', 'endswith', 'lo', -2)
index d0223c514cbea19be4469ee310f4afe014c8969d..b56cb4962f0c7ed1208e9f3f3b20a42efa242c41 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@ Release date: 2015-07-05
 Core and Builtins
 -----------------
 
+- Issue #24284: The startswith and endswith methods of the str class no longer
+  return True when finding the empty string and the indexes are completely out
+  of range.
+
 - Issue #24115: Update uses of PyObject_IsTrue(), PyObject_Not(),
   PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
   to check for and handle errors correctly.
index 84e67e6f28dae66c199ce174363470d49da7b616..1eaf2e977d9cf72a571e691c7894d20289c7a6a8 100644 (file)
@@ -9280,14 +9280,14 @@ tailmatch(PyObject *self,
         PyUnicode_READY(substring) == -1)
         return -1;
 
-    if (PyUnicode_GET_LENGTH(substring) == 0)
-        return 1;
-
     ADJUST_INDICES(start, end, PyUnicode_GET_LENGTH(self));
     end -= PyUnicode_GET_LENGTH(substring);
     if (end < start)
         return 0;
 
+    if (PyUnicode_GET_LENGTH(substring) == 0)
+        return 1;
+
     kind_self = PyUnicode_KIND(self);
     data_self = PyUnicode_DATA(self);
     kind_sub = PyUnicode_KIND(substring);