Ecco una versione rivista del tuo codice che funziona ancora e inoltre illustra come sollevare un ValueError
nel modo desiderato. A proposito, penso find_last()
, find_last_index()
o qualcosa di simile sarebbe un nome più descrittivo per questa funzione. Ad aumentare la possibile confusione c'è il fatto che Python ha già un metodo di oggetto contenitore denominato __contains__()
che fa qualcosa di leggermente diverso, dal punto di vista dei test di appartenenza.
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'
Aggiornamento: un modo sostanzialmente più semplice
Wow! Ecco una versione molto più concisa, essenzialmente una riga singola, che è probabilmente anche più veloce perché inverte (tramite [::-1]
) la stringa prima di eseguire una ricerca in avanti attraverso di essa per il primo carattere corrispondente e lo fa utilizzando il index()
metodo della stringa integrato veloce . Per quanto riguarda la tua domanda reale, un piccolo vantaggio bonus che viene fornito con l'uso index()
è che solleva già un ValueError
quando la sottostringa del carattere non viene trovata, quindi non è richiesto nulla di aggiuntivo per farlo accadere.
Eccolo insieme a un rapido unit test:
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