关于字符串:为什么Python在找不到子字符串时会抛出错误?

Why does Python throw an error when a substring is not found?

这背后的设计思想是什么?

对我来说,做这样的事情更容易

1
2
if string.index(substring) > -1:
    # do stuff

而不是试图捕获异常。如果找不到substring,至少程序不会中断。

有人告诉我"返回-1是一个坏模式"。为什么会这样?

检查子串的方法是什么?


str.index()抛出了一个异常;您可能考虑的是str.find()方法:

1
if string.find(substring) > -1:

str.index()文件明确规定:

Like find(), but raise ValueError when the substring is not found.

然而,测试子串成员资格的正确方法是使用in

1
if substring in string:

因为这样至少函数的返回类型是固定的。另外,你的例子不是Python,它应该是:

1
2
if str in string:
    # do stuff


正如SvenMarnach在回答中所解释的那样,python的工作原理是"请求宽恕比允许更容易"(EAFP)。它允许公共路径的代码保持在一起,从而使逻辑更容易理解,而不会在处理内联错误时使流混乱。在一个使用import threading进行非阻塞I/O的程序中,只读取一次变量会使时间检查到使用时间(toctou)错误的可能性低于其他语言鼓励的look-before-leap样式。

EAFP的主要缺点是用于异常处理的python语法与函数式编程风格不匹配。如果不定义和命名函数,就无法捕获生成器表达式的可ITerable输入中单个元素的异常。