re.findall()可以返回None吗?

时间:2018-07-02 12:29:42

标签: python documentation return-value

documentation仅表示返回“列表”。我假设当找不到匹配项时,它会返回一个空列表(但不会返回None),并且永远不会返回None。但是我不确定。谁能确认?

还有,我将来有办法自行检查其他功能(例如ElementTree.findall())吗?我可以假设每当文档说“列表”时,它的行为都一样吗?

2 个答案:

答案 0 :(得分:1)

>>> import re
>>> s = "hello"
>>> re.findall("a", s)
[]

对于这类问题,请打开python shell并运行它:根据文档,它总是返回一个列表,但是没有找到,因此它是一个空列表。

内在问题:

  

“我只希望文档说“它不返回None”或“它总是返回列表”。

我认为您需要了解Python文档的样式。第一行是

  

“将字符串中所有不重复的模式匹配作为字符串列表返回”。

如果返回了其他任何内容,它将声明此内容。例如:在同一页上,对于子:

  

“返回通过用替换repl替换字符串中最左边的不重复出现的模式而获得的字符串。如果找不到该模式,则返回的字符串不变”

这说明了边缘情况

您不能假定任何库任何人编写的所有函数都将具有与python核心一样好的文档。但是对于Python的核心功能,是的,它们通常几乎总是像文档所说的那样工作。 (核心功能是https://docs.python.org/2/contents.htmlhttps://docs.python.org/3/contents.html

子页面中的任何内容

如果您从pypi获取随机库,则文档可能不那么完美。

关于python的“坏”事情之一是它的文档遭受异常之类的事情的折磨。像Java这样的语言,其中异常是函数/方法的定义的一部分,而返回类型则更为严格。基本上,请尝试记住Python的Zen并随其一起使用。 python.org/dev/peps/pep-0020

答案 1 :(得分:1)

我同意现有的答案/意见,您可以信任内置函数以仅返回文档说的内容,并且快速进行自我测试应该可以使您对常见的极端情况有信心。但是为了完整起见,让我们深入了解一下。可以在here中找到CPython的findall源代码。我们真的只对return语句感兴趣,它们是:

if (!state_init(&state, self, string, pos, endpos))
    return NULL;

list = PyList_New(0);
if (!list) {
    state_fini(&state);
    return NULL;
}

//...

state_fini(&state);
return list;

error:
Py_DECREF(list);
state_fini(&state);
return NULL;

因此此函数可以返回两个可能的值:列表或NULL。

在此处返回NULL会向解释器发出函数will raise an exception的信号。如果函数想要返回None,它将执行Py_RETURN_NONE。它不会在此处执行此操作,因此我们可以合理地假设findall将始终返回列表,只要它不会崩溃即可。