Проверка объекта на число в Python: аналог Java instanceof
Быстрый ответ
Чтобы определить, принадлежит ли объект в Python к числовым типам, используйте функцию isinstance()
совместно с модулем numbers
следующим образом:
from numbers import Number
def is_num(value):
return isinstance(value, Number)
# Пример использования:
print(is_num(123)) # True
print(is_num(-4.56)) # True
print(is_num("foo")) # False
С помощью этого подхода можно определить не только стандартные числовые типы int, float и complex, но и другие, соответствующие абстрактному классу Number
.
Надёжные методы определения числовых значений
Потребность в ручной проверке типа
Согласно принципу утиной типизации в Python, главное — это способности объекта, а не его тип. Однако иногда требуется удостовериться, что объект на самом деле является числом. В этом вам поможет функция isinstance()
, позволяющая избежать ошибок.
Сценарии использования и их ограничения
isinstance()
— это полезный инструмент, но не идеален: могут возникнуть сложности с числами из библиотеки Numpy и снижение эффективности в высоконагруженных системах. В таких ситуациях часто предпочтительнее использовать обработку исключений или придерживаться правил утиной типизации.
Абстрактные базовые классы к вашим услугам
Абстрактные базовые классы (АБК), вроде numbers.Number
, обеспечивают гибкий подход к проверке типов и поддерживают широкий спектр числовых типов, включая пользовательские и сторонние.
Визуализация
Если представить все объекты огорода (🌱🌿) и найти среди них морковки (🥕) — наши числа, то с помощью детектора чисел (🔍) процесс будет выглядеть так:
Урожай: 🌱🌿🍅🥕🌽🥕🌿🍆🥕🥒
Запустим детектор чисел (🔍):
1. Это корень? (Проверка типа)
🌱❓🌿❓🍅❌🥕✅🌽❌🥕✅🌿❓🍆❌🥕✅🥒❌
2. Умеет ли считать или измерять? (Применение isinstance)
🌱❌🌿❌🍅❌🥕✅🌽❌🥕✅🌿❌🍆❌🥕✅🥒❌
🥕 = Число (✅)
Все остальное = Не число (❌)
То есть, числовые объекты определяются через проверку isinstance(obj, Number)
.
Глубокое погружение в определение числовых значений
Использование механизма обработки ошибок
Порой проще выполнить операцию и быть готовым к обработке исключений, чем заранее проверять тип. Этот подход отражает философию Python – "Лучше попросить прощения, чем разрешения" (EAFP).
def try_operations(value):
try:
return value + 0, value / 1
except TypeError:
return False
# Пример использования:
print(try_operations(2)) # (2, 2.0)
print(try_operations('a')) # False
Когда вам нужна точечная проверка типа
Если требуется более строгий подход и вы хотите исключить логические значения, явно укажите типы для проверки:
def is_strict_num(value):
return isinstance(value, (int, float, complex)) and not isinstance(value, bool)
# Пример использования:
print(is_strict_num(123)) # True
print(is_strict_num(True)) # False
Обзор числовых типов
Чтобы узнать, какие типы считаются числовыми в модуле numbers, примените следующий метод:
import numbers
print(Number.__subclasses__()) # Исследуем числовые типы
Полезные материалы
- Функция isinstance() в Python — руководство по использованию
isinstance()
. - Числа в Python — основная информация о числовых типах в Python.
- Проверка типов в Python (Руководство) – Real Python — статья о суть проверки типов в Python.
- Встроенные типы — Документация Python 3.12.2 — детальное изучение числовых типов.
- numbers — Числовые абстрактные базовые классы — Документация Python 3.12.2 — применение абстрактных базовых классов для работы с числами.
- Реализация интерфейса в Python – Real Python — об абстрактных базовых классах и создании интерфейсов в Python.
- PEP 3141 – Иерархия типов для чисел — о иерархии числовых типов в Python.