Ответ 1
raise ValueError('could not find %c in %s' % (ch,str))
У меня есть этот код, который находит наибольший индекс определенного символа в строке, однако я бы хотел, чтобы он повысил ValueError
, когда указанный символ не встречается в строке.
Так что-то вроде этого:
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()
, или что-то подобное, было бы более описательным именем для этой функции. Добавление к возможной путанице связано с тем фактом, что в Python уже есть метод объекта-контейнера с именем __contains__()
который выполняет что-то немного другое в __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()
является то, что он уже вызывает 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
>>>
В последней версии python вы можете использовать fstrings для этого
позволяет value = "Hello"
raise ValidationError(f"{value} is not valid category")
>>> response='bababa'
... if "K" in response.text:
... raise ValueError("Not found")