Функция isinstance() в Python: проверка типов

Обновлено:

Функция:

isinstance()

используется для проверки типа объекта.

До знакомства с ней такую проверку можно было бы выполнить через:

type()

Например:

number = 10

print(
    type(number) == int
)

Результат:

True

Или:

print(
    type(number) is int
)

Результат:

True

Но для обычной проверки типа объекта в Python рекомендуется использовать:

isinstance()

PEP 8 прямо рекомендует использовать isinstance() вместо непосредственного сравнения типов.


1. Синтаксис isinstance()

В простом случае функция принимает два аргумента:

isinstance(object, class)

Первый аргумент:

object

— объект, тип которого мы хотим проверить.

Второй:

class

— класс, с которым выполняется проверка.

Функция возвращает:

bool

то есть:

True

или:

False

2. Проверка int

number = 100

result = isinstance(
    number,
    int,
)

print(result)

Результат:

True

3. Проверка другого типа

number = 100

print(
    isinstance(
        number,
        str,
    )
)

Результат:

False

Потому что объект:

100

относится к классу:

int

а не str.


4. Другие примеры

print(
    isinstance(
        10.5,
        float,
    )
)
# True
print(
    isinstance(
        'Python',
        str,
    )
)
# True
print(
    isinstance(
        [10, 20, 30],
        list,
    )
)
# True
print(
    isinstance(
        (10, 20, 30),
        tuple,
    )
)
# True

isinstance() внутри if

5. Самый частый вариант использования

Обычно результат isinstance() сразу используется в условии:

value = 100

if isinstance(
    value,
    int,
):
    print(
        'Получено целое число'
    )

Результат:

Получено целое число

Отдельную переменную:

result = isinstance(...)

создавать необязательно, если результат нужен только для проверки.


6. Разная обработка разных типов

Например:

value = 'python'

if isinstance(
    value,
    str,
):
    print(
        value.upper()
    )
else:
    print(
        'Получена не строка'
    )

Результат:

PYTHON

Здесь проверка типа позволяет сначала убедиться, что объект является строкой, а затем использовать строковый метод:

upper()

Несколько допустимых типов

7. tuple во втором аргументе

Иногда нас устраивает не один конкретный тип, а несколько.

Например, программа должна принимать:

int

или:

float

В таком случае вторым аргументом можно передать кортеж классов:

isinstance(
    object,
    (
        int,
        float,
    ),
)

Функция вернёт True, если объект подходит хотя бы под один из указанных типов. Официальный Python FAQ отдельно показывает именно такой способ проверки нескольких классов.


8. Проверяем число

value = 10

if isinstance(
    value,
    (
        int,
        float,
    ),
):
    print(
        'Получено число'
    )

Результат:

Получено число

Для:

value = 10.5

результат тоже будет:

Получено число

А для:

value = '10'

проверка вернёт:

False

Почему isinstance() лучше type()

9. type() проверяет точный класс

Например:

print(
    type(True) is int
)

Результат:

False

Потому что точный класс объекта:

True

— это:

bool

Но мы уже знаем, что:

bool

является подклассом:

int

Поэтому:

print(
    isinstance(
        True,
        int,
    )
)

вернёт:

True

isinstance() учитывает не только сам указанный класс, но и его подклассы. Это прямо описано в официальной документации Python.


10. Сравнение двух подходов

Прямая проверка типа:

type(value) is int

спрашивает примерно:

Точный класс объекта — именно int?

А:

isinstance(
    value,
    int,
)

спрашивает:

Является ли объект экземпляром int или класса, являющегося его подклассом?

Именно поэтому в обычном Python-коде для проверки типа предпочтителен:

isinstance()

11. Рекомендация PEP 8

PEP 8 приводит прямую рекомендацию:

if isinstance(
    obj,
    int,
):
    ...

вместо непосредственного сравнения типов через:

type()

То есть для обычной проверки принадлежности объекта к типу используем:

isinstance()

а type() оставляем для ситуаций, когда действительно требуется узнать сам класс объекта или намеренно проверить точный тип.


Главное по теме

Функция:

isinstance()

проверяет принадлежность объекта указанному классу.

Синтаксис:

isinstance(
    object,
    class,
)

Например:

isinstance(
    10,
    int,
)

возвращает:

True

Для нескольких допустимых типов используем tuple:

isinstance(
    value,
    (
        int,
        float,
    ),
)

Чаще всего isinstance() используется непосредственно внутри:

if

Например:

if isinstance(
    value,
    str,
):
    ...

Для обычной проверки типа:

isinstance(
    object,
    class,
)

предпочтительнее, чем:

type(object) == class

или:

type(object) is class

потому что isinstance() предназначена именно для такой проверки и учитывает наследование.