Created on 2015-05-25 11:41 by serhiy.storchaka, last changed 2015-05-31 06:17 by serhiy.storchaka. This issue is now closed.
The behavior of startswith in corner case is inconsistent between str and bytes in Python 3, str and unicode in Python 2, and between str in Python 2 and Python 3.
Python 3:
>>> ''.startswith('', 1, 0)
True
>>> b''.startswith(b'', 1, 0)
False
Python 2:
>>> ''.startswith('', 1, 0)
False
>>> u''.startswith(u'', 1, 0)
True
If define s1.startswith(s2, start, end) for non-negative indices and non-tuple s2 as an equivalent to the expression `start + len(s2) <= end and s2[start: start + len(s2)] == s2` or to `s1.find(s2, start, end) == start`, "".startswith("", 1, 0) should be False.
The same issue exists for endswith. See issue24243 for more detailed discussion.
Proposed patch fixes str.startswith and str.endswith.
I think this can only be applied in a feature release (and I think it should be, because of the backward-compatibility-with-python2 issue). However, since this is potentially controversial, we need some more opinions.
I can’t imagine much code would rely on either old or new behaviour. If you only put it into a feature release, would you have to document it as a change in behaviour?
Just in the what's new porting section, I think. The fact that there "should" be very little to no code that relies on this is why I'd like to see it fixed. The fact that the report was a theoretical one, and not one that broke code, is why I think we should fix it only in 3.5.
Could you please help me with wording?
How about this for What’s New: * 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`. Perhaps that is good enough, but if you wanted to be more precise, I think the actual condition is if the *start* index is beyond the end of the string, or *end* is before *start*.
Thank you Martin.
New changeset a82498f424fe by Serhiy Storchaka in branch '3.5': Issue #24284: The startswith and endswith methods of the str class no longer https://hg.python.org/cpython/rev/a82498f424fe New changeset 04162e06323f by Serhiy Storchaka in branch 'default': Issue #24284: The startswith and endswith methods of the str class no longer https://hg.python.org/cpython/rev/04162e06323f
messages:
+ msg244036
versions:
- Python 2.7, Python 3.4, Python 3.6