Top.Mail.Ru
Ответы

Почему методы библиотеки re выпадают в ошибку, если получают None для поиска?

Если строка пустая как обьект (например, в случае параметра конфига pip) то при попытке поиска вываливается исключение. Почему бы просто не вернуть None, так как не нашлось же ничего? Или это как-то что-то ломает?

По дате
По рейтингу
Аватар пользователя
7мес

Методы библиотеки re (например, re.search, re.match, re.findall) в Python требуют, чтобы первым аргументом всегда была строка (или подобный объект). Если вместо строки передается значение None, возникает исключение TypeError, потому что None не имеет методов или поведения, как у строки.

Почему нельзя автоматически вернуть None?

  1. Обнаружение ошибок:


Если методы re принимали бы None и просто возвращали None, это могло бы затруднить отладку. Например, если ошибка возникла из-за некорректного ввода данных (например, забыли инициализировать строку), она бы осталась незамеченной.

  1. Возникновение TypeError сигнализирует разработчику, что передается некорректное значение, требующее исправления.

Явное лучше неявного (принцип Zen of Python):

В Python ценится прозрачность и предсказуемость кода. Если метод ожидает строку, он должен требовать строку. Передача None — это ошибка разработчика, которую нужно исправить.

  1. Совместимость типов:


Python не преобразует None в пустую строку автоматически, потому что это было бы неочевидно. None и '' (пустая строка) имеют разные значения в контексте программирования.

  1. Проблемы с поведением:


Если re. search или другой метод возвращал бы None для None, было бы неясно, что произошло: не найдено совпадений или строка отсутствует.

Как избежать ошибки?

  1. Чтобы предотвратить возникновение исключения, нужно проверить значение перед передачей его в методы re:


Пример:
python
Копировать код (снизу)
import re

# Значение, которое может быть None
string_to_search = None

# Проверяем перед вызовом re.search
if string_to_search is not None:
match = re.search (r'\d+', string_to_search)
print(match)
else:
print("Строка отсутствует")

  1. Альтернативно, можно заменить None на пустую строку:

python
Копировать код (снизу)
string_to_search = None
match = re.search (r'\d+', string_to_search or '')
print(match) # Вернет None, если ничего не найдено

Вывод:

Возникновение ошибки при передаче None — это осознанное решение разработчиков Python, направленное на упрощение отладки и повышение устойчивости кода. Если None передается в метод re, это скорее всего ошибка логики программы, и Python помогает её обнаружить.