Как обрабатывать пустую строку в функции?
Что проверяют
Думаете ли вы о граничных случаях до того, как пишете код, и понимаете ли, что пустая строка в данных бывает разной природы. Следом обычно спрашивают, чем пустая строка отличается от None и NaN и что делать с такими значениями в датафрейме.
Как отвечать
Сначала контракт: пустая строка для этой функции это допустимое значение, ошибка входа или пропуск? От ответа зависит всё остальное.
- ошибка входа: выбросьте
ValueErrorс понятным текстом. Возвращать строку «Ошибка: пустая строка» нельзя: вызывающий код получит данные вперемешку с сообщениями, и они уедут дальше в признаки; - пропуск: верните
Noneи отразите это в сигнатуре,def clean(s: str | None) -> str | None; - пробелы: решите, считается ли пустой строка из пробелов и переводов строки. Обычно проверяют
not s.strip(); - явная проверка:
if not sловит и"", иNone, но заодно и0, если функции когда-нибудь передадут число.
В pandas работают векторно: df["text"].str.strip().replace("", pd.NA), потом isna().sum(), чтобы посчитать, сколько таких строк. read_csv по умолчанию превращает пустое поле в NaN, но строка из пробелов останется строкой.
Для текстовых моделей пустой документ после токенизации даёт нулевой вектор в TF-IDF или бессмысленный эмбеддинг. Такие строки лучше отфильтровать и залогировать их долю, чем молча кормить ими модель.
Покажите тест: pytest.mark.parametrize по значениям "", " ", "\n", None и нормальной строке.
Где спотыкаются
Проверяют if not s на значениях из датафрейма. NaN в булевом контексте истинен, поэтому пропуск проходит проверку и падает дальше на .strip() с AttributeError.
Не знают разницы в split: "".split(",") возвращает [''], список из одной пустой строки, а "".split() возвращает пустой список. Отсюда фантомные «слова» в признаках.
Молча выбрасывают пустые строки. Если их треть датасета, это сигнал о сломанном источнике, а не мелочь для dropna().