Voici une version révisée de votre code qui fonctionne toujours et qui illustre la manière de lever un ValueError
comme vous le souhaitez. En passant, je pense que find_last()
, find_last_index()
ou quelque chose de similaire serait un nom plus descriptif pour cette fonction. Le fait que Python dispose déjà d'une méthode pour l'objet conteneur nommée __contains__()
qui fait quelque chose d'un peu différent, en ce qui concerne les tests d'adhésion.
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 - Une méthode nettement plus simple
Ouah ! Voici une version beaucoup plus concise - essentiellement en une ligne - qui est aussi probablement plus rapide parce qu'elle inverse (via [::-1]
) la chaîne de caractères avant d'effectuer une recherche en avant dans la chaîne de caractères pour la premier et ce, en utilisant la chaîne de caractères rapide intégrée index()
méthode. En ce qui concerne votre question proprement dite, l'utilisation de la méthode index()
est qu'il soulève déjà une ValueError
lorsque la sous-chaîne de caractères n'est pas trouvée, de sorte que rien d'autre n'est nécessaire pour que cela se produise.
Le voici, accompagné d'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
6 votes
Juste comme ça, raise ValueError() hahaha
0 votes
@user531225 : Pouvez-vous accepter une autre réponse afin que je puisse supprimer la mienne. Merci :)
0 votes
@THC4k : C'est bizarre qu'il renvoie la position de l'occurrence la plus à droite au lieu du nombre.
0 votes
@ErikAllik : De toute évidence, il l'a fait - il a posté sur StackOverflow. Qu'y a-t-il de mal à cela ?