다음은 여전히 작동하는 수정 된 버전의 코드와 ValueError
원하는 방식 으로 제기하는 방법을 보여줍니다 . 별로 - 방법, 생각 find_last()
, find_last_index()
또는 뭔가 simlar이 기능에 대한 더 자세한 설명 이름이됩니다. 혼동 가능성을 더하는 것은 Python이 이미 __contains__()
멤버십 테스트 측면에서 약간 다른 작업을 수행 하는 이름 이 지정된 컨테이너 객체 메서드를 가지고 있다는 사실입니다 .
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'
업데이트 — 훨씬 더 간단한 방법
와! 여기에 훨씬 더 간결한 버전 (본질적으로 한 줄)이 있습니다. [::-1]
이는 첫 번째 일치하는 문자에 대해 순방향 검색을 수행하기 전에 문자열을 역순으로 (통해 ) 검색 하고 빠른 내장 문자열 index()
메서드를 사용 하기 때문에 더 빠를 가능성이 높습니다. . 실제 질문과 관련하여 사용시 제공되는 약간의 보너스 편의 는 문자 하위 문자열을 찾을 수 없을 때 index()
이미 a를 ValueError
발생 시키므로 추가가 필요하지 않다는 것입니다.
여기에 빠른 단위 테스트가 있습니다.
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