Может ли re.findall () вернуть None? - PullRequest
0 голосов
/ 02 июля 2018

Документация говорит только о том, что возвращает "список". Я предполагаю, что когда он не находит совпадений, он возвращает пустой список (но не None) и никогда не возвращает None. Но я не уверен. Кто-нибудь может подтвердить?

Кроме того, есть ли у меня способ проверить это в будущем самостоятельно для других функций (например, ElementTree.findall())? Могу ли я предположить, что всякий раз, когда документы говорят «список», они будут вести себя одинаково?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я согласен с существующими ответами / комментариями о том, что вы можете доверять встроенным функциям, чтобы они возвращали только то, что говорится в документации, которую они возвращают, и что небольшое быстрое самотестирование должно дать вам уверенность в поведении общих угловых случаев. Но ради полноты давайте посмотрим немного глубже. Исходный код 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 здесь сигнализирует интерпретатору, что функция вызовет исключение . Если бы функция хотела вернуть None, она бы сделала Py_RETURN_NONE. Здесь этого не происходит, поэтому мы можем разумно предположить, что findall всегда будет возвращать список, если только он не падает.

0 голосов
/ 02 июля 2018
>>> import re
>>> s = "hello"
>>> re.findall("a", s)
[]

Для такого рода вопросов откройте оболочку Python и запустите ее: согласно документации, она всегда возвращает список, но ничего не может найти, поэтому это пустой список.

Для внутреннего вопроса:

«Я просто хочу, чтобы в документации говорилось« она не возвращает None »или« она всегда возвращает список ».»

Я думаю, что вам нужно понять стиль документации Python. Первая строка

«Возвращать все неперекрывающиеся совпадения шаблона в строке как список строк».

Если бы он возвратил что-нибудь еще, он бы сказал это. например, на той же странице, для подпункта:

"Вернуть строку, полученную путем замены крайнего левого не перекрывающегося вхождения шаблона в строке на repl замены. Если шаблон не найден, строка возвращается без изменений"

это заявляет крайний случай

Вы не можете предполагать, что все функции , написанные кем-либо в любой библиотеке , будут иметь такую ​​же хорошую документацию, как ядро ​​Python. Но для основных функций в Python, да, они обычно почти всегда делают так, как говорят документы. (Основные функции находятся внутри подстраниц: https://docs.python.org/2/contents.html или https://docs.python.org/3/contents.html

Если вы возьмете случайную библиотеку из pypi, документы могут быть не идеальными.

Одна из «плохих» вещей в python - то, что его документация страдает от таких вещей, как исключения. Такие языки, как Java, где исключения являются частью определения функции / метода, а возвращаемые типы строже. По сути, постарайтесь запомнить Zen of Python и просто продолжать с ним. python.org/dev/peps/pep-0020

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...