Comment générer une erreur ValueError?

J’ai ce code qui trouve le plus grand index d’un caractère spécifique dans une chaîne, mais je voudrais qu’il soulève un ValueError lorsque le caractère spécifié ne se produit pas dans une chaîne.

Donc quelque chose comme ça:

 contains('bababa', 'k') 

entraînerait un:

ValueError: could not find k in bababa

Comment puis-je faire ceci?

Voici le code actuel pour ma fonction:

 def contains(ssortingng,char): list = [] for i in range(0,len(ssortingng)): if ssortingng[i] == char: list = list + [i] return list[-1] 

raise ValueError('could not find %c in %s' % (ch,str))

Voici une version révisée de votre code qui fonctionne toujours et qui illustre comment générer une ValueError comme vous le souhaitez. Au passage, je pense que find_last() , find_last_index() , ou quelque chose de similaire, serait un nom plus descriptif pour cette fonction.

 def contains(char_ssortingng, char): largest_index = -1 for i, ch in enumerate(char_ssortingng): 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_ssortingng)) print(contains('mississippi', 's')) # -> 6 print(contains('bababa', 'k')) # -> 
 Traceback (most recent call last): File "how-to-raise-a-valueerror.py", line 15, in  print(contains('bababa', 'k')) File "how-to-raise-a-valueerror.py", line 12, in contains raise ValueError('could not find {} in {}'.format(char, char_ssortingng)) ValueError: could not find 'k' in 'bababa' 

Mise à jour – Un moyen beaucoup plus simple

Hou la la! Voici une version beaucoup plus concise – essentiellement un one-liner – qui est aussi probablement plus rapide car elle inverse (via [::-1] ) la chaîne avant de la parcourir pour le premier caractère correspondant et utilise la méthode rapide d’ index() chaîne intégrée index() . En ce qui concerne votre question actuelle, un petit avantage pratique ValueError à l’utilisation de index() est qu’il ValueError déjà une ValueError lorsque la sous-chaîne de caractères n’est pas trouvée. Rien de plus n’est donc nécessaire pour que cela se produise.

Ici c’est avec un test unitaire rapide:

 def contains(char_ssortingng, char): # Ending - 1 adjusts returned index to account for searching in reverse. return len(char_ssortingng) - char_ssortingng[::-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  print(contains('bababa', 'k')) File "better-way-to-raise-a-valueerror", line 6, in contains return len(char_ssortingng) - char_ssortingng[::-1].index(char) - 1 ValueError: subssortingng not found 
 >>> def contains(ssortingng, char): ... for i in xrange(len(ssortingng) - 1, -1, -1): ... if ssortingng[i] == char: ... return i ... raise ValueError("could not find %r in %r" % (char, ssortingng)) ... >>> contains('bababa', 'k') Traceback (most recent call last): File "", line 1, in  File "", line 5, in contains ValueError: could not find 'k' in 'bababa' >>> contains('bababa', 'a') 5 >>> contains('bababa', 'b') 4 >>> contains('xbababa', 'x') 0 >>> 

Dans la dernière version de python, vous pouvez utiliser fssortingngs pour cela.

Laisse value = "Hello"

 raise ValidationError(f"{value} is not valid category") 
 >>> response='bababa' ... if "K" in response.text: ... raise ValueError("Not found")