ValueError를 발생시키는 방법?


115

문자열에서 특정 문자의 가장 큰 인덱스를 찾는이 코드가 있지만 ValueError지정된 문자가 문자열에서 발생하지 않을 때 a를 발생시키고 싶습니다 .

그래서 다음과 같이 :

contains('bababa', 'k')

결과는 다음과 같습니다.

ValueError: could not find k in bababa

어떻게 할 수 있습니까?

내 기능에 대한 현재 코드는 다음과 같습니다.

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

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

  return list[-1]

5
마찬가지로 ValueError ()를 올리십시오. hahaha
slezica 2010

@ user531225 : 내가 내 것을 삭제할 수 있도록 다른 대답을 수락 할 수 있습니까? 감사합니다 :)
pyfunc 2010

@ THC4k : 카운트 대신 가장 오른쪽에있는 위치를 반환한다는 점이 이상합니다.
John Machin

@ErikAllik : 분명히 그는 그랬습니다. 그는 StackOverflow에 게시했습니다. 그게 무슨 문제입니까?
Michael Scheper

답변:


178

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


2
메시지를 사용하지 않으려면 raise ValueError대신 raise ValueError()?
Tomasz Gandor

27

다음은 여전히 ​​작동하는 수정 된 버전의 코드와 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

두 번째 기능 : OP는 for루프를 필요 / 원합니다 . 첫 번째 기능 : contains('foo', 'f').
John Machin

1
@John Machin : 첫 번째 기능에서 발견 한 버그를 수정했습니다. 알려 주셔서 감사합니다. 나는 OP의 질문이나 그 아래의 주석 for에서 답변에 루프 가 필요하거나 필요하다는 것을 나타내는 어떤 것도 보지 못합니다 . 어쨌든 내 첫번째 기능 쇼를 어떻게 문자가있는 발견되지 않는 경우 입니다 그들은 무엇을 요구. .NET Framework의 컨텍스트에서 수행하는 방법을 설명했습니다 . 비록 그들이 어떤 이유로 원하더라도 , 나는 다른 사람들이 적어도 다소 흥미로운 것없이 두 번째 버전을 찾을 수 있다고 생각합니다. raiseValueErrorforfor
martineau 2010

"나는 루프에 사용할 :-)"@pyfunc에 의해 지금은 삭제 된 대답 초기 의견이었다
존 머신

1
@John Machin : 내가 보지 않았거나 볼 수없는 삭제 된 답변의 댓글에서 요청을 존중하지 않은 것에 대해 책임을 질 수 있다고 생각하지 마십시오. 그러나, 제 2 기능은 사용하지 않는 경우에도 for루프를, 그것은 않는 방식으로의 실제에 대한 질문 어떻게 대답 raiseValueError즉 당신을 위해 그것을 않는 다른 뭔가를 호출하여 - 문자가 문자열에서 발견되지 않을 때. 또한 OP가 for산스 for솔루션을 보거나 나중에 Python에 더 익숙해 진 후 고정 또는 그 무엇이든 극복 할 수 있다는 전망도 있습니다 .
martineau 2010

12
>>> 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
>>>

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

1
이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Donald Duck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.