DamiRocK

Python: явный isinstance() вместо сравнения с именем типа

Проверяем, является ли значение строкой. Различаем str, ‘str’, type(value) и isinstance(), включая случай подкласса.

Тип не является строковой подписью

Имена 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. Проверка сохранена; аннотация согласована с назначением.

Reading preferences

Appearance
Contrast
More options

Saved only in this browser. Your device’s reduced-motion setting is always respected. Browser zoom works throughout the site.