【问题标题】:How to signal "index not found" in Python Function result如何在 Python 函数结果中表示“未找到索引”
【发布时间】:2014-01-31 15:17:10
【问题描述】:

我正在编写一个小函数来返回字符串列表中第一次出现的字符串的索引,使用“模糊”比较。

我的问题是:表示目标字符串与源列表中的任何字符串不匹配的正确方法是什么?

显而易见(唯一?)要做的事情是返回 -1。但由于 Python 中的 -1 表示序列的最后一个元素,我觉得这可能不是好的 Python 风格。有没有更 Pythonic(Pythonesque?)的方式?

【问题讨论】:

  • 感谢大家的好建议。作为 Python 的新手,我没有想到引发异常的想法。并行索引方法的想法对我来说似乎是最 Pythonic(Pythonesque?)。但是我可能会选择 None 路线,因为我确实发现带有 try / exception 子句的代码有点麻烦。再次,非常感谢。

标签: python indexing


【解决方案1】:

我的问题是:表示目标字符串与源列表中的任何字符串不匹配的正确方法是什么?

提出错误

raise ValueError("String Not Found")

Python 是一种鸭式语言;请参阅:http://en.wikipedia.org/wiki/Duck_typing,因此“引发适当的错误”是完全可以接受和接受的约定。

更新:像往常一样,现在已经有几个答案和 cmets 甚至建议使用 raise ValueError。 IHMO 我认为IndexError 更合适;但这可能是风格和个人品味的问题。另请阅读:The Zen of Python -- 特别是围绕 “应该有一种——最好只有一种——明显的方式来做到这一点。”

更新二:我想为了保持一致,应该使用 Pyton 的内置 list.index()str.index() raise ValueError(...) :)

【讨论】:

  • @jonrsharpe 谢谢 :) 这毕竟是野兽的本性吗(Python)。
  • 话虽如此,str.index 确实使用了ValueError。我猜是因为错误与 sub 参数有关(它不是要查找的有效子字符串);没有下标实际上是out of range
  • @jonrsharpe 那是True :) 我将更新我对ValueError 的回答,因为list.index()str.index() 都提出了这个问题——为了保持一致性,我仍然认为它是最好提高IndexError 但是哦,好吧:)
【解决方案2】:

你可以返回None,它是空对象。

要检查结果,您可以使用is 运算符。检查null object in Python?

【讨论】:

    【解决方案3】:

    根据 Python 文档;

    str.rindex; Like rfind() but raises ValueError when the substring sub is not found.

    str.rfind(); Return -1 on failure

    如果你想保持与 Python 的 std 库相同的设计,假设你的函数与 str.rindex 做几乎相同的事情,那么引发 ValueError()。但是,如果您的函数更像 rfind,则返回 -1。

    如果您不关心与标准库保持相同的设计原则,那么请使用您喜欢的任何样式。

    http://docs.python.org/2/library/stdtypes.html#str.count

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2021-02-23
      • 1970-01-01
      相关资源
      最近更新 更多