Aquí hay una versión revisada de su código que aún funciona y además ilustra cómo generar una de ValueErrorla manera que desee. Por cierto, creo find_last(), find_last_index()o algo similar sería un nombre más descriptivo para esta función. A la posible confusión se suma el hecho de que Python ya tiene un método de objeto contenedor llamado __contains__()que hace algo un poco diferente, en cuanto a pruebas de pertenencia.
def contains(char_string, char):
largest_index = -1
for i, ch in enumerate(char_string):
if ch == char:
largest_index = i
if largest_index > -1: # any found?
return largest_index # return index of last one
else:
raise ValueError('could not find {!r} in {!r}'.format(char, char_string))
print(contains('mississippi', 's')) # -> 6
print(contains('bababa', 'k')) # ->
Traceback (most recent call last):
File "how-to-raise-a-valueerror.py", line 15, in <module>
print(contains('bababa', 'k'))
File "how-to-raise-a-valueerror.py", line 12, in contains
raise ValueError('could not find {} in {}'.format(char, char_string))
ValueError: could not find 'k' in 'bababa'
Actualización: una forma sustancialmente más sencilla
¡Guauu! Aquí hay una versión mucho más concisa, esencialmente de una sola línea, que probablemente también sea más rápida porque invierte (a través de [::-1]) la cadena antes de realizar una búsqueda hacia adelante a través de ella para el primer carácter coincidente y lo hace utilizando el index()método de cadena incorporado rápido . Con respecto a su pregunta real, una pequeña ventaja adicional que viene con el uso index()es que ya genera un ValueErrorcuando no se encuentra la subcadena de caracteres, por lo que no se requiere nada adicional para que eso suceda.
Aquí está junto con una prueba unitaria rápida:
def contains(char_string, char):
# Ending - 1 adjusts returned index to account for searching in reverse.
return len(char_string) - char_string[::-1].index(char) - 1
print(contains('mississippi', 's')) # -> 6
print(contains('bababa', 'k')) # ->
Traceback (most recent call last):
File "better-way-to-raise-a-valueerror.py", line 9, in <module>
print(contains('bababa', 'k'))
File "better-way-to-raise-a-valueerror", line 6, in contains
return len(char_string) - char_string[::-1].index(char) - 1
ValueError: substring not found