Inconsistent behaviour os str.find/str.index when providing optional parameters

Alister alister.ware at ntlworld.com
Wed Nov 21 11:59:05 EST 2012


On Wed, 21 Nov 2012 04:43:57 -0800, Giacomo Alzetta wrote:

> I just came across this:
> 
>>>> 'spam'.find('', 5)
> -1
> 
> 
> Now, reading find's documentation:
> 
>>>> print(str.find.__doc__)
> S.find(sub [,start [,end]]) -> int
> 
> Return the lowest index in S where substring sub is found,
> such that sub is contained within S[start:end].  Optional arguments
> start and end are interpreted as in slice notation.
> 
> Return -1 on failure.
> 
> Now, the empty string is a substring of every string so how can find
> fail?
> find, from the doc, should be generally be equivalent to
> S[start:end].find(substring) + start, except if the substring is not
> found but since the empty string is a substring of the empty string it
> should never fail.
> 
> Looking at the source code for find(in stringlib/find.h):
> 
> Py_LOCAL_INLINE(Py_ssize_t)
> stringlib_find(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
>                const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
>                Py_ssize_t offset)
> {
>     Py_ssize_t pos;
> 
>     if (str_len < 0)
>         return -1;
> 
> I believe it should be:
> 
>     if (str_len < 0)
>         return (sub_len == 0 ? 0 : -1);
> 
> Is there any reason of having this unexpected behaviour or was this
> simply overlooked?

why would you be searching for an empty string?
what result would you expect to get from such a search?



-- 
Turn your Pentium into an XT -- just add Windows! 



More information about the Python-list mailing list