Voici une version révisée de votre code qui fonctionne toujours et qui illustre comment élever un ValueErrorcomme vous le souhaitez. À propos, je pense find_last(), find_last_index()ou quelque chose de similaire serait un nom plus descriptif pour cette fonction. Ajout à la confusion possible est le fait que Python a déjà une méthode d'objet conteneur nommée __contains__()qui fait quelque chose d'un peu différent, en ce qui concerne les tests d'appartenance.
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'
Mise à jour - Un moyen nettement plus simple
Hou la la! Voici une version beaucoup plus-essentiellement en une ligne qui est probablement plus rapide concise car elle inverse (via [::-1]) la chaîne avant de faire une recherche en avant à travers elle pour le premier caractère correspondant et il le fait en utilisant la chaîne intégrée rapide index()méthode . En ce qui concerne votre question réelle, un petit avantage supplémentaire qui vient avec l'utilisation index()est qu'il déclenche déjà un ValueErrorlorsque la sous-chaîne de caractères n'est pas trouvée, donc rien de plus n'est nécessaire pour que cela se produise.
Le voici avec un test unitaire rapide:
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