Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Илья Ниязов Мастер (1191), открыт 1 неделю назад
Если строка пустая как обьект (например, в случае параметра конфига pip) то при попытке поиска вываливается исключение. Почему бы просто не вернуть None, так как не нашлось же ничего? Или это как-то что-то ломает?
1 ответ
alternativeGod Мастер (1926) 1 неделю назад
Методы библиотеки 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 помогает её обнаружить.
Похожие вопросы