How to raise a ValueError?

我有这样的代码,它可以在字符串中找到特定字符的最大索引,但是我希望它在字符串中没有指定字符时引发 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]
234585 次浏览

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

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

这里是你的代码的一个修订版本,它仍然可以工作,另外它说明了如何提高一个 ValueError的方式,你想要的。顺便说一下,我认为 find_last()find_last_index()或者类似的名字对这个函数来说更具描述性。另一个可能的混淆是 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()带来的一个不错的小小便利是,当找不到字符子字符串时,它已经引发了 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
>>> response='bababa'
...  if "K" in response.text:
...     raise ValueError("Not found")