如何提高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")