如何引发ValueError?


115

我有这段代码可以找到字符串中特定字符的最大索引,但是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]

5
就是这样,提高ValueError()哈哈哈
slezica 2010年

@ user531225:您可以接受另一个答案,以便我删除我的吗?谢谢:)
pyfunc 2010年

@ THC4k:很奇怪,它返回最右边出现的位置而不是计数。
约翰·马钦

@ErikAllik:显然,他做到了—他发布到了StackOverflow。怎么了
Michael Scheper

Answers:


178

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


2
您是否知道,如果您不想使用该消息,可以raise ValueError代替raise ValueError()
Tomasz Gandor

27

这是您的代码的修订版本,该版本仍然有效,并且还说明了如何提高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

第二功能:OP需要/需要for循环。第一项功能:失败contains('foo', 'f')
约翰·马钦

1
@John Machin:修复了您在第一个函数中发现的错误,感谢您引起我的注意。我在OP的问题或其下面的注释中没有看到任何表明他们需要或想要for循环回答的内容,尽管确实有人在自己的代码中出现了。总之我的第一功能显示他们如何raiseValueError当字符没有发现这什么,他们问。并且我已经说明了如何在for。即使他们for出于某种原因想要一个,我认为其他人可能会发现没有一个有趣的第二版本。
martineau 2010年

“我想用于循环:-)”是@pyfunc现在删除的答案的早期评论
John Machin 2010年

1
@约翰·马钦(John Machin):不要以为我没有履行我没有也看不到的已删除答案注释中的要求,因此我不承担责任。然而,即使我的第二个功能,不使用for循环,它确实在某种程度上回答有关实际问题是如何raiseValueError当字符串中没有找到的字符-即通过调用别的,它会为你。还有一种可能是,OP for在看到无用的for解决方案或以后对Python更加熟悉之后,可能会克服其固定问题或其他问题。
martineau 2010年

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

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

1
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
唐老鸭
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.