Как проверить тип данных в Python (тип против isinstance)

Узнайте, как проверять типы данных в Python. Поймите, когда использовать type(), а когда isinstance(), обрабатывать пользовательские классы и писать безопасные проверки проверки типов.

Попробуйте это решение в редакторе

Обзор

Python — это динамически типизированный язык, а это означает, что переменные могут содержать значения любого типа данных, и их тип может меняться во время выполнения. Хотя такая гибкость ускоряет первоначальную разработку, она также требует проверки типов переменных во время выполнения перед выполнением операций, специфичных для типа, таких как выполнение арифметических операций с целыми числами или вызов строковых методов.

Для проверки типа данных объекта Python предоставляет две основные функции: type() и isinstance(). Функция type(obj) возвращает точный тип класса объекта. Хотя вы можете использовать `type(obj) == int` для проверки того, является ли число целым числом, этот метод обычно не рекомендуется, поскольку он не поддерживает структуры наследования (подкласс целого числа будет иметь значение `False`).

Рекомендуемый питонический способ проверки типов — `isinstance(obj, class_info)`. Эта функция проверяет, является ли объект экземпляром указанного класса или какого-либо подкласса, унаследованного от него. Он также поддерживает проверку кортежа классов (например, isinstance(value, (int, float))), что делает код проверки очень гибким и надежным.

Код и вывод выполнения

Этот скрипт демонстрирует проверку типов переменных с использованием как type(), так и isinstance(), показывая различия в наследовании.

value_int = 42
value_str = "hello"

# 1. Checking type using isinstance() (Recommended)
is_number = isinstance(value_int, int)
print(f"Is {value_int} an int? {is_number}")

# Checking against multiple possible types
is_num_or_str = isinstance(value_str, (int, float, str))
print(f"Is '{value_str}' int, float, or str? {is_num_or_str}")

# 2. Checking type using type() (For exact class matches)
print(f"Exact type of value_int: {type(value_int).__name__}")
print("Is value_int exactly an int?", type(value_int) is int)

# 3. Inheritance difference
class CustomList(list):
    pass

my_list = CustomList([1, 2, 3])

print("\nInheritance testing:")
print("isinstance(my_list, list):", isinstance(my_list, list))
print("type(my_list) is list:", type(my_list) is list)
Терминальный выход
Is 42 an int? True
Is 'hello' int, float, or str? True
Exact type of value_int: int
Is value_int exactly an int? True

Inheritance testing:
isinstance(my_list, list): True
type(my_list) is list: False

Пошаговая реализация

  • Используйте isinstance(variable, type_name) для общей проверки типов (в соответствии с наследованием).
  • Передайте кортеж типов, таких как isinstance(variable, (int, float)) для проверки на соответствие нескольким классам.
  • Используйте тип (переменная) — имя_типа только тогда, когда вы должны гарантировать точное соответствие класса, игнорируя подклассы.

Часто задаваемые вопросы

Почему isinstance() предпочтительнее type()?

isinstance() поддерживает наследование объектов и полиморфизм. Если вы создадите подкласс встроенного типа, isinstance() правильно распознает его как экземпляр родительского класса, тогда как type() выдаст значение False.

Как я могу проверить, является ли объект вызываемым (например, функция)?

Используйте встроенную функцию callable(), которая возвращает True, если объект можно вызвать как функцию.

Связанные темы

Рекомендуемые ресурсы Python

Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.