Тип не является строковой подписью
Имена str, int и bool обозначают типы, а "str" — строковый литерал. Поэтому проверка вроде type(value) == "str" сравнивает разные виды объектов и не определяет, является ли значение строкой.
Задание источника
Реализуйте предикат is_string, возвращающий True для строк и False для других значений:
def is_string(value: object) -> bool:
return isinstance(value, str)
Аннотация object здесь выбрана редакцией вместо ограничивающего str в исходном варианте: функция специально принимает значения разных типов, чтобы их проверить.
Контрольные примеры
print(is_string("hello")) # True
print(is_string("")) # True
print(is_string(10)) # False
print(is_string(None)) # False
Пустая строка ложна в условном контексте, но остаётся строкой. Поэтому bool(value) не заменяет проверку типа.
Почему isinstance
isinstance(value, str) учитывает также экземпляры подклассов str. Сравнение type(value) is str проверяет только точное совпадение типа. Эти операции решают близкие, но не одинаковые задачи; в задании выбран вариант принадлежности к строковому типу, а не только к точному классу.
Не преобразовывать перед проверкой
isinstance(str(value), str) почти всегда подтвердит тип уже преобразованного результата, а не исходного аргумента. Проверка должна исследовать переданное значение до преобразования.
Аннотации помогают описать договор, но не выполняют эту проверку вместо тела функции. Именно вызов isinstance возвращает нужный логический результат при выполнении программы.
Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Проверка сохранена; аннотация согласована с назначением.