Как узнать тип переменной в Python: type и isinstance
Основы определения типа объекта
Основной способ определения типа объекта в Python — использование встроенных функций type() и isinstance(). type(obj) возвращает точный класс объекта, а isinstance(obj, classinfo) проверяет, является ли объект экземпляром указанного класса или его наследника. Это фундаментальные инструменты, которые покрывают большинство сценариев.
x = 42
print(type(x)) # <class 'int'>
print(isinstance(x, int)) # TrueSet str python (множество из строки в python)
Когда использовать: type() — если требуется строгое совпадение типа (например, в сериализации). isinstance() — если необходима проверка с учётом наследования (полиморфизм).
Как узнать точный тип объекта без учёта наследования?
Применяется type(obj). Результат — сам класс, а не просто имя. Для сравнения можно использовать type(obj) is SomeClass.
value = 3.14
if type(value) is float:
print("Это float")Python переменная время (переменные для времени в python)
Ошибка: многие путают type(obj) == SomeClass и isinstance(obj, SomeClass). В случае наследования type() вернёт класс потомка, а isinstance() — True для родителя.
Как проверить принадлежность к нескольким типам сразу?
isinstance(obj, (tuple, list, set)) — передаётся кортеж классов. Если объект относится к любому из них, вернётся True.
data = [1, 2, 3]
print(isinstance(data, (list, tuple))) # TruePython объект тип (тип объекта в python)
Как получить класс объекта через атрибут __class__?
Атрибут __class__ хранит ссылку на класс, к которому принадлежит экземпляр. Он аналогичен type(obj), но может быть переопределён в пользовательских классах.
class MyClass: pass
obj = MyClass()
print(obj.__class__) # <class '__main__.MyClass'>
print(type(obj)) # <class '__main__.MyClass'>вещественные значения python (вещественные значения в python)
Проблема: если в классе переопределён атрибут __class__ (например, через свойство), obj.__class__ может вернуть неверное значение. В таких случаях следует использовать type().
Как проверить, что объект равен None?
Используйте оператор is (не ==). None — синглтон, поэтому obj is None — корректная идиома.
result = None
if result is None:
print("Значение отсутствует")вывести тип данных python (вывод типа данных в python)
Как определить, можно ли вызвать объект?
Функция callable(obj) возвращает True, если объект поддерживает вызов (функции, классы, объекты с методом __call__).
def foo(): pass
print(callable(foo)) # True
print(callable(42)) # FalsePython двоичные данные (работа с двоичными данными в python)
Как проверить, является ли класс подклассом другого?
issubclass(SubClass, ParentClass) — работает с классами, не с экземплярами.
class Animal: pass
class Dog(Animal): pass
print(issubclass(Dog, Animal)) # Trueпеременная int python какая переменная (переменная int в python - что это?)
Как получить аннотации типов для функции?
Модуль typing предоставляет get_type_hints(func), который возвращает словарь с типами аргументов и возврата.
from typing import get_type_hints
def greet(name: str) -> str:
return "Hello " + name
print(get_type_hints(greet)) # {'name': <class 'str'>, 'return': <class 'str'>}Типичные ошибки и их решение:
- Путаница type и isinstance: при проверке на булев тип
type(True) is boolвернёт True, аisinstance(True, int)— тоже True, так какbool— подклассint. Если нужно строго отличить bool от int, используйтеtype(x) is bool. - Проверка на None через ==:
if obj == Noneможет быть ложно-положительным для объектов с переопределённым__eq__. Правильно —obj is None. - Проверка на пользовательские классы с помощью type: если классы наследуются и важен полиморфизм, используйте
isinstance(). - Нестандартные типы (numpy, pandas): у них своя иерархия типов. Стандартные функции работают, но могут быть неочевидные моменты, например,
isinstance(np.ndarray, np.generic).
Расширенные примеры определения типа
Пример 1. Различие type и isinstance для bool и int
b = True
print("type(b):", type(b)) # <class 'bool'>
print("isinstance(b, int):", isinstance(b, int)) # True
print("type(b) is int:", type(b) is int) # False
print("isinstance(b, bool):", isinstance(b, bool)) # Truetype(b): <class 'bool'> isinstance(b, int): True type(b) is int: False isinstance(b, bool): True
Если требуется строгое различение булевых и целых чисел, используйте type(b) is bool.
Пример 2. Проверка с учётом наследования пользовательских классов
class Vehicle:
pass
class Car(Vehicle):
pass
tesla = Car()
print("type:", type(tesla)) # <class '__main__.Car'>
print("isinstance Vehicle:", isinstance(tesla, Vehicle)) # True
print("type is Vehicle:", type(tesla) is Vehicle) # Falsetype: <class '__main__.Car'> isinstance Vehicle: True type is Vehicle: False
Пример 3. Использование is для проверки на None
def get_value():
return None
result = get_value()
# Правильно
if result is None:
print("Нет значения")
# Ошибочно (эквивалент, но медленнее и ломается при переопределении __eq__)
if result == None:
print("Тоже сработает, но не рекомендуется")Нет значения Тоже сработает, но не рекомендуется
Пример 4. isinstance с абстрактными базовыми классами (collections.abc)
from collections.abc import Iterable, Sequence, Mapping
print("list is Iterable:", isinstance([1,2], Iterable)) # True
print("str is Sequence:", isinstance("abc", Sequence)) # True
print("dict is Mapping:", isinstance({}, Mapping)) # True
print("int is Iterable:", isinstance(5, Iterable)) # Falselist is Iterable: True str is Sequence: True dict is Mapping: True int is Iterable: False
Это удобно для проверки интерфейсов без привязки к конкретной реализации.
Пример 5. issubclass для метаклассов и проверки наследования классов
class Meta(type):
pass
class MyClass(metaclass=Meta):
pass
class SubClass(MyClass):
pass
print("issubclass SubClass, MyClass:", issubclass(SubClass, MyClass)) # True
print("issubclass MyClass, Meta:", issubclass(MyClass, Meta)) # False (Meta - метакласс, не суперкласс)
print("isinstance(MyClass, Meta):", isinstance(MyClass, Meta)) # Trueissubclass SubClass, MyClass: True issubclass MyClass, Meta: False isinstance(MyClass, Meta): True
Пример 6. Получение аннотаций типов для функции с вложенными типами
from typing import get_type_hints, List, Optional
def process(items: List[int], prefix: Optional[str] = None) -> bool:
return len(items) > 0
hints = get_type_hints(process)
print(hints){'items': typing.List[int], 'prefix': typing.Optional[str], 'return': <class 'bool'>}Пример 7. Проверка на Union типов через isinstance с кортежем
from typing import Union
Number = Union[int, float]
value = 3.14
# isinstance не поддерживает Union напрямую, но можно передать кортеж
if isinstance(value, (int, float)):
print("Это число")Это число
Для сложных Union рекомендуется использовать вспомогательные функции или библиотеки типа isinstance с кортежем.
Пример 8. Использование type(obj).__name__ для логирования
def log_type(obj):
print(f"Тип объекта: {type(obj).__name__}")
log_type(42) # int
log_type("hello") # str
log_type([1,2,3]) # listТип объекта: int Тип объекта: str Тип объекта: list