【问题标题】:How to raise a ValueError?如何引发 ValueError?
【发布时间】:2011-05-22 13:14:35
【问题描述】:

我有这段代码可以找到字符串中特定字符的最大索引,但是我希望它在字符串中不出现指定字符时引发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]

【问题讨论】:

  • 就这样,引发ValueError()哈哈哈
  • @user531225:你能接受一些其他答案,以便我可以删除我的。谢谢:)
  • @THC4k:太奇怪了,它返回最右边出现的位置而不是计数。
  • @ErikAllik:显然,他做到了——他发布到 StackOverflow。这有什么问题?

标签: python string


【解决方案1】:

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

【讨论】:

  • 您知道吗,如果您不想使用该消息,可以只使用raise ValueError 而不是raise ValueError()
【解决方案2】:

这是您的代码的修订版本,它仍然有效,并且说明了如何以您想要的方式提出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'

更新——更简单的方法

哇!这是一个更简洁的版本 - 基本上是单行 - 这也可能更快,因为它在向前搜索 first 匹配字符之前反转(通过[::-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') 失败。
  • @John Machin:修复了您在第一个函数中发现的错误,感谢您引起我的注意。我在 OP 的问题或它下面的 cmets 中没有看到任何表明他们需要或希望在答案中使用 for 循环的内容,尽管确实出现在他们自己的代码中。无论如何,我的第一个函数向他们展示了当找不到他们所要求的字符时如何raiseValueError。我已经说明了如何在for 的上下文中进行操作。即使他们出于某种原因想要for,我认为其他人可能会发现没有第二个版本至少有点有趣。
  • “我想使用 for 循环 :-)”是对 @pyfunc 现已删除的答案的早期评论
  • @John Machin:不要认为我可以为不尊重我没有也看不到的已删除答案的 cmets 请求负责。然而,即使我的第二个函数不使用for 循环,它确实在某种程度上回答了关于如何在找不到字符时raiseValueError 的实际问题在字符串中——即通过调用其他为你做的事情。在看到 sans-for 解决方案或以后更熟悉 Python 之后,OP 也有可能克服他们的 for-fixation 或其他任何问题。
【解决方案3】:
>>> 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。没用。
【解决方案4】:
>>> response='bababa'
...  if "K" in response.text:
...     raise ValueError("Not found")

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
猜你喜欢
  • 2019-07-31
  • 2018-05-21
  • 2021-08-23
  • 2019-07-11
  • 2018-07-19
  • 1970-01-01
  • 2018-12-07
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多