Как добавить проверку на пустую строку в функцию Python?
Что проверяют
Знаете ли вы идиоматичный Python и можете ли сформулировать контракт функции: что считать пустым, что делать с None и пробелами. Следом просят объяснить разницу между not s и s == "" и решить, возвращать флаг или бросать исключение.
Как отвечать
Идиоматичная проверка по PEP 8 опирается на то, что пустая строка ложна:
if not s:: ловит"", но заодноNone,0и[]. Годится, если тип гарантирован подсказкойs: strи проверкой mypy;if not s.strip():: строка из одних пробелов тоже считается пустой.strip()без аргументов убирает все пробельные символы Unicode, включая\n,\tи неразрывный пробел;if s is None:: еслиNoneозначает «значение не передано», проверяйте его отдельно и первым, иначеNone.strip()упадёт сAttributeError;isinstance(s, str): когда данные приходят извне и тип не гарантирован.
Дальше решите, что делает функция при пустом вводе. Если пустая строка это ошибка вызывающего, ставьте проверку в самом начале: raise ValueError("name must not be empty"). Возвращать в таком случае None или False опасно, результат легко забыть проверить. Если пустая строка допустима, верните понятное значение по умолчанию.
На внешних входах (API, конфиги) проверку удобнее отдать валидации. В Pydantic v2 это Annotated[str, StringConstraints(strip_whitespace=True, min_length=1)], и клиент получит понятную ошибку без ручного if.
Покажите и тест: pytest.mark.parametrize с "", " ", "\n", None и нормальной строкой.
Где спотыкаются
Пишут if s is "":. Оператор is сравнивает идентичность объектов, а не значения, и Python выдаёт на такое сравнение с литералом SyntaxWarning.
Используют not s там, где на вход приходит не только строка. Ноль или пустой список молча проходят как «пустая строка», и ошибка всплывает далеко от места.
Смешивают в одной функции None, пустую строку и пробелы, и всё возвращает True. Потом никто не может сказать, какой случай что означал. Контракт лучше проговорить вслух до кода.