Как проверить тип данных в 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. Освойте конструктор __init__, методы экземпляра, ключевое слово self и создание экземпляров объектов.
Как обрабатывать исключения в PythonУзнайте, как обрабатывать исключения в Python с помощью блоков try, кроме, else иfinally. Пишите безошибочный и устойчивый к сбоям код Python.
Рекомендуемые ресурсы Python
Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.
Подсказки по типам Python
Узнайте, как писать подсказки типов в Python. Улучшите качество кода, включите автодополнение и используйте mypy для статического анализа кода.
Памятка по преобразованию типов Python
Изучите неявные и явные преобразования типов в Python. Преобразование между строками, целыми числами, числами с плавающей запятой, списками, наборами и словарями.
Python против TypeScript: динамические сценарии против типобезопасной сети
Сравните Python и TypeScript. Узнайте о системах структурных типов, метаданных декораторов, проверках компилятора, средах выполнения веб-страниц и инструментах разработчика.