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

时间:2014-09-18 15:32:12

标签: python string

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

对我来说,做

之类的事情更容易
if string.index(substring) > -1:
    # do stuff

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

有人告诉我'返回-1是一个糟糕的模式'。那是为什么?

检查子字符串的Pythonic方法是什么?

3 个答案:

答案 0 :(得分:14)

str.index()抛出异常;你可能会想到str.find() method而不是:

if string.find(substring) > -1:

str.index() documentation明确说明了这一点:

  

find()类似,但在找不到子字符串时会引发ValueError

但是,测试子字符串成员资格的正确方法是使用in

if substring in string:

答案 1 :(得分:3)

因为这种方式至少修复了函数的返回类型。你的例子也不是pythonic,它应该是:

if str in string:
    # do stuff

答案 2 :(得分:1)

Python在&#34的原则下运作;更容易请求宽恕而不是许可&#34; (EAFP),如an answer by Sven Marnach中所述。它允许将公共路径的代码保持在一起,使逻辑更容易理解,而不会使内联错误处理混乱流程。在使用import threading进行非阻塞I / O的程序中,只读取一次变量会使time-of-check-to-time-of-use (TOCTTOU)个错误的可能性低于其他一些语言所鼓励的先行先跳模式。< / p>

EAFP的主要缺点是Python的异常处理语法与函数式编程风格并不完美。您无法捕获可迭代输入中的各个元素的异常,而无需定义和命名函数。