Как узнать тип переменной в Python: type и isinstance

Раздел: Основы Python -> Типы данных

Основы определения типа объекта

Основной способ определения типа объекта в Python — использование встроенных функций type() и isinstance(). type(obj) возвращает точный класс объекта, а isinstance(obj, classinfo) проверяет, является ли объект экземпляром указанного класса или его наследника. Это фундаментальные инструменты, которые покрывают большинство сценариев.

x = 42
print(type(x))            # <class 'int'>
print(isinstance(x, int)) # True

Set 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)))  # True

Python объект тип (тип объекта в 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))      # False

Python двоичные данные (работа с двоичными данными в 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).
- определение объекта python (определение типа объекта в python)
- определение типа данных python (определение типов данных в python)
- Python максимальное целое число (максимальное целое число в python)

Расширенные примеры определения типа

Пример 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)) # True
type(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)        # False
type: <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))         # False
list 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))           # True
issubclass 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

Определение типа объекта в Python - comments

En
определение объекта python (python)