Ecco una versione rivista del tuo codice che funziona ancora e inoltre illustra come sollevare un ValueErrornel 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 ValueErrorquando 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