From: Serhiy Storchaka Date: Sun, 31 May 2015 06:15:51 +0000 (+0300) Subject: Issue #24284: The startswith and endswith methods of the str class no longer X-Git-Tag: v3.5.0b3~131 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d4ea03c785d659576e0ae65c12fe5c03ada872d0;p=python 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. --- diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index c39d975f87..ee0e5d12bf 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -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 -------------------- diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 6e26474a3b..e086994b0b 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index d0223c514c..b56cb4962f 100644 --- 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. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 84e67e6f28..1eaf2e977d 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -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);