118 votes

Comment lever une ValueError ?

J'ai ce code qui trouve le plus grand index d'un caractère spécifique dans une chaîne de caractères, mais j'aimerais qu'il lève un ValueError lorsque le caractère spécifié ne figure pas dans une chaîne de caractères.

Donc quelque chose comme ça :

contains('bababa', 'k')

se traduirait par un :

ValueError: could not find k in bababa

Comment faire ?

Voici le code actuel de ma fonction :

def contains(string,char):
  list = []

  for i in range(0,len(string)):
      if string[i] == char:
           list = list + [i]

  return list[-1]

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.

185voto

NPE Points 169956

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

6 votes

Saviez-vous que, si vous ne souhaitez pas utiliser le message, vous pouvez simplement raise ValueError au lieu de raise ValueError() ?

28voto

martineau Points 21665

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

11voto

John Machin Points 39706
>>> def contains(string, char):
...     for i in xrange(len(string) - 1, -1, -1):
...         if string[i] == char:
...             return i
...     raise ValueError("could not find %r in %r" % (char, string))
...
>>> contains('bababa', 'k')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in contains
ValueError: could not find 'k' in 'bababa'
>>> contains('bababa', 'a')
5
>>> contains('bababa', 'b')
4
>>> contains('xbababa', 'x')
0
>>>

0 votes

Cette fonction toujours lève une ValueError. Ce n'est pas utile.

3voto

Kaushik Dey Points 49
>>> response='bababa'
...  if "K" in response.text:
...     raise ValueError("Not found")

1 votes

Bien que ce code puisse répondre à la question, le fait de fournir un contexte supplémentaire concernant la manière dont il résout le problème et/ou la raison pour laquelle il le fait améliorerait la valeur à long terme de la réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X