classification
Title: Documentation for return value for string.rindex is missing when search string is empty
Type: enhancement Stage: patch review
Components: Documentation Versions: Python 3.6
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: docs@python Nosy List: docs@python, kgashok, martin.panter, r.david.murray, rhettinger, serhiy.storchaka, veky
Priority: normal Keywords: patch

Created on 2017-09-18 08:04 by kgashok, last changed 2017-09-18 15:55 by r.david.murray.

Pull Requests
URL Status Linked Edit
PR 3642 open kgashok, 2017-09-18 09:26
Messages (14)
msg302418 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 08:04
"abcde".rindex("") returns 5
"a".rindex("") returns 1 

This is not documented anywhere in the Python documentation.
msg302421 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 08:19
Also, "".rindex("") returns 0
msg302422 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 08:24
string.find() also exhibits the same behaviour.

"abcde".find("") -> 5 which also is not documented anywhere.
msg302424 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2017-09-18 08:31
This is documented.

"Return the highest index in the string where substring sub is found,"
msg302427 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 08:57
The documentation (https://docs.python.org/3/library/stdtypes.html#str.find) does not describe what will be the behaviour if the substring is "". 

And by the way, as per https://docs.python.org/3/reference/expressions.html#membership-test-operations, 

    Empty strings are always considered to be a substring of any other 
    string, so "" in "abc" will return True.

Returning an invalid index value, although confusing, should at least be documented in some form.
msg302431 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2017-09-18 09:11
The behaviour for searching for empty strings in Python is inconsistent; see Issue 24243. IMO the behaviour for the (r)find/index methods is sensible, but it is worth making the documentation explicit.

The returned indexes you have given (5, 1, and 0) are valid for slicing.
msg302435 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2017-09-18 09:31
The documentation doesn't mention empty string specially because there is nothing special with empty string.

Returned index value is valid. "abcde"[5:5] == "".

Issue24243 is about the case of end < start. Not this case.

I don't see a bug here.
msg302436 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 09:34
I am not saying that there is a bug. As Martin points out, "it is worth making the documentation explicit."
msg302437 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 09:36
How about 

"abcde"[5]
Traceback (most recent call last):
  File "python", line 1, in <module>
IndexError: string index out of range
msg302438 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2017-09-18 09:43
5 is not valid index of character, but it is valid index of substring.

IMHO documenting explicitly miscellaneous particular cases which are not exceptions of general rules just adds a noise. This makes the documentation larger and decrease the chance that it will be read.
msg302443 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 09:53
Look at my suggested changes. It doesn't add noise, IMHO.

All I am saying is that the explicit behaviour needs to be documented. 
I unnecessarily wasted at least 3-4 hours on this "undocumented" behavior.
msg302444 - (view) Author: Ashok Bakthavathsalam (kgashok) * Date: 2017-09-18 10:08
@Storchaka, 

You say `5` is related to the substring. Pray, explain how 5 is related to a null substring? Also, from https://bugs.python.org/msg243710, as per the great Hettinger:

   Though this is closed as not a bug, feel free to add an example or a 
   mention in the documentation.  Keep it short though.  

That's all I am asking to be included.
msg302455 - (view) Author: Vedran Čačić (veky) * Date: 2017-09-18 14:14
This is nonsense. 'abcde'[7:7] is also ''. So the maximal index in fact doesn't exist. What do you think exactly is the property that differentiates 5 from 7 here?
msg302465 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2017-09-18 15:55
You have to remember that the most useful way to think about python slice indexes is that they point between characters. Consider, for example, that you have a starting index of something, and you are looking backward in the string for a trailing delimiter:

  >>> x = 'this is <weird example> of something'
  >>> x.rfind('>', 9)
  22
  >>> x[9:22]
  'weird example'

So the above is why 5 is different from 7: 5 is the index that you would use in a slice if you wanted the string that ended before the match...and the match in the null string case is the end of the string.  That is, Python is being consistent in this degenerate case.
History
Date User Action Args
2017-09-18 15:55:59r.david.murraysetmessages: + msg302465
2017-09-18 14:14:07vekysetnosy: + veky
messages: + msg302455
2017-09-18 12:33:30kgashoksettype: behavior -> enhancement
2017-09-18 10:08:03kgashoksetmessages: + msg302444
2017-09-18 09:53:39kgashoksetmessages: + msg302443
2017-09-18 09:43:06serhiy.storchakasetnosy: + rhettinger, r.david.murray
messages: + msg302438
2017-09-18 09:36:48kgashoksetmessages: + msg302437
2017-09-18 09:34:09kgashoksetmessages: + msg302436
2017-09-18 09:31:14serhiy.storchakasetmessages: + msg302435
2017-09-18 09:26:10kgashoksetkeywords: + patch
stage: patch review
pull_requests: + pull_request3637
2017-09-18 09:11:26martin.pantersetnosy: + martin.panter
messages: + msg302431
2017-09-18 08:57:10kgashoksetmessages: + msg302427
2017-09-18 08:31:57serhiy.storchakasetnosy: + serhiy.storchaka
messages: + msg302424
2017-09-18 08:24:45kgashoksetmessages: + msg302422
2017-09-18 08:19:14kgashoksetmessages: + msg302421
2017-09-18 08:15:22kgashoksetassignee: docs@python

components: + Documentation, - Library (Lib)
nosy: + docs@python
2017-09-18 08:04:47kgashokcreate