如何提高ValueError?

我有这个代码find一个string中的特定字符的最大索引,但是我希望当指定的字符不会出现在string中时引发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()或类似的东西将是这个函数更具描述性的名称。

 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 {} in {}'.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] )的string之前,通过它的第一个匹配的字符进行前瞻性search,它使用快速的内置stringindex()方法。 关于你的实际问题,使用index()方法带来的一点好处是,当没有find字符子string时,它已经引发了一个ValueError ,所以不需要额外的东西来实现。

这里有一个快速的unit testing:

 def contains(char_string, char): # (-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 >>> 
 >>> response='bababa' ... if "K" in response.text: ... raise ValueError("Not found") 

在最新版本的python中,你可以使用fstrings来实现这个function

value = "Hello"

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