Guido van Rossum dixit (2011-10-04, 19:21):
Other ideas: returning some more structured object than an integer (like re.match does) feels like overkill, and returning an (index, success) tuple is begging for lots of mysterious occurrences of  or .
A lightweight builtin type whose instances would have `index` attribute might do the job well (together with None as not-found).
A naive pure-Python implementation:
class Found(object): __slots__ = 'index', def __init__(self, index): self.index = index
found = s.find('foo') if found: # or more explicit: `if found is not None:` print('foo found at %d' % found.index) else: # found is None print('foo not found')
Of course that would be probably a new method, not str.find(), say: str.search(). Then it could be possible to make it a bit more universal, accepting substring tuples (as startswith/endswith already do):
one_of = 'foo', 'bar', 'baz' found = s.search(one_of) if found: print('%s found at %d' % (found.substring, found.index)) else: print('None of %s found' % one_of)
The 4th line could be respelled as:
index, substring = found print('%s found at %d' % (substring, index))
A naive implementation of s.search() result type:
class Found(object): __slots__ = 'index', 'substring' def __init__(self, index, substring): self.index = index self.substring = substring def __iter__(self): yield self.index yield self.substring