Функция 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() предназначена именно для такой проверки и учитывает наследование.