2010-12-08 7 views
61

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.Comment faire pour augmenter une ValueError?

donc quelque chose comme ceci:

contains('bababa', 'k') 

se traduirait par un:

ValueError: could not find k in bababa

Comment puis-je faire cela?

Voici le code actuel pour ma fonction:

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

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

    return list[-1] 
+0

Quelle est votre question? – Falmarri

+2

comment puis-je augmenter un ValueError – user531225

+3

Juste comme ça, augmenter ValueError() hahaha – slezica

Répondre

112

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

9
>>> 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 
>>> 
15

est ici une version révisée du code qui fonctionne encore plus il illustre comment élever un ValueError la façon dont vous voulez. En passant, je pense que find_last(), find_last_index(), ou quelque chose de plus serait un nom plus descriptif pour cette fonction.

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 {} in {}'.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 façon

beaucoup plus simple Wow! 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 faire une recherche en avant pour le premier caractère correspondant et il le fait en utilisant la construction rapide dans la chaîne index() méthode. En ce qui concerne votre vraie question, une petite commodité de bonus qui vient avec index() est qu'elle soulève déjà un ValueError lorsque la sous-chaîne de caractère n'est pas trouvée, donc rien de plus n'est requis pour que cela se produise.

Ici, il est ainsi un test unitaire rapide:

def contains(char_string, char): 
    # (-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 
+0

2ème fonction: L'OP a besoin/veut une boucle 'for'. 1ère fonction: FAIL pour 'contains ('foo', 'f')'. –

+0

@John Machin: Correction d'un bug que vous avez trouvé en 1ère fonction, merci de l'avoir porté à mon attention. Je ne vois rien dans la question de l'OP ou les commentaires ci-dessous qui indiquent qu'ils ont besoin ou veulent une boucle for pour une réponse bien qu'il se trouve quelque chose dans leur propre code.Quoi qu'il en soit, ma première fonction leur montre comment "augmenter" un "ValueError" quand le caractère n'est pas trouvé, ce qui est * ce * qu'ils ont demandé. et j'ai illustré comment faire dans le contexte d'un «pour». Même s'ils veulent un «pour» pour une raison quelconque, je pense que d'autres pourraient trouver la deuxième version sans au moins un peu intéressant. – martineau

+0

"Je veux utiliser pour la boucle :-)" était un commentaire précoce à la réponse maintenant-supprimé par @pyfunc –

0
>>> response='bababa' 
... if "K" in response.text: 
...  raise ValueError("Not found") 
+0

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la façon et/ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse. –

0

Dans la dernière version de python, vous pouvez utiliser fstrings pour cette

permet value = "Hello"

raise ValidationError(f"{value} is not valid category") 
Questions connexes