Проверка объекта на число в Python: аналог Java instanceof

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы определить, принадлежит ли объект в Python к числовым типам, используйте функцию isinstance() совместно с модулем numbers следующим образом:

Python
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

Надёжные методы определения числовых значений

Потребность в ручной проверке типа

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

Сценарии использования и их ограничения

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

Абстрактные базовые классы к вашим услугам

Абстрактные базовые классы (АБК), вроде numbers.Number, обеспечивают гибкий подход к проверке типов и поддерживают широкий спектр числовых типов, включая пользовательские и сторонние.

Визуализация

Если представить все объекты огорода (🌱🌿) и найти среди них морковки (🥕) — наши числа, то с помощью детектора чисел (🔍) процесс будет выглядеть так:

Markdown
Скопировать код
Урожай: 🌱🌿🍅🥕🌽🥕🌿🍆🥕🥒

Запустим детектор чисел (🔍):

Markdown
Скопировать код
1. Это корень? (Проверка типа)
   🌱❓🌿❓🍅❌🥕✅🌽❌🥕✅🌿❓🍆❌🥕✅🥒❌

2. Умеет ли считать или измерять? (Применение isinstance)
   🌱❌🌿❌🍅❌🥕✅🌽❌🥕✅🌿❌🍆❌🥕✅🥒❌

🥕 = Число (✅)
Все остальное = Не число (❌)

То есть, числовые объекты определяются через проверку isinstance(obj, Number).

Глубокое погружение в определение числовых значений

Использование механизма обработки ошибок

Порой проще выполнить операцию и быть готовым к обработке исключений, чем заранее проверять тип. Этот подход отражает философию Python – "Лучше попросить прощения, чем разрешения" (EAFP).

Python
Скопировать код
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

Когда вам нужна точечная проверка типа

Если требуется более строгий подход и вы хотите исключить логические значения, явно укажите типы для проверки:

Python
Скопировать код
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, примените следующий метод:

Python
Скопировать код
import numbers
print(Number.__subclasses__())  # Исследуем числовые типы

Полезные материалы

  1. Функция isinstance() в Python — руководство по использованию isinstance().
  2. Числа в Python — основная информация о числовых типах в Python.
  3. Проверка типов в Python (Руководство) – Real Python — статья о суть проверки типов в Python.
  4. Встроенные типы — Документация Python 3.12.2 — детальное изучение числовых типов.
  5. numbers — Числовые абстрактные базовые классы — Документация Python 3.12.2 — применение абстрактных базовых классов для работы с числами.
  6. Реализация интерфейса в Python – Real Python — об абстрактных базовых классах и создании интерфейсов в Python.
  7. PEP 3141 – Иерархия типов для чисел — о иерархии числовых типов в Python.