programing tip

ValueError를 발생시키는 방법?

itbloger 2020. 8. 19. 07:48
반응형

ValueError를 발생시키는 방법?


문자열에서 특정 문자의 가장 큰 인덱스를 찾는이 코드가 있지만 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]

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


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

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

최신 버전의 파이썬에서는이를 위해 fstrings를 사용할 수 있습니다.

하자 value = "Hello"

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

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

참고 URL : https://stackoverflow.com/questions/4393268/how-to-raise-a-valueerror

반응형