Какой самый питонный способ проверить, является ли объект числом? - PullRequest
98 голосов
/ 09 августа 2010

Для произвольного объекта python, как лучше определить, является ли он числом? Здесь is определяется как acts like a number in certain circumstances.

Например, скажем, вы пишете векторный класс. Если задан другой вектор, вы хотите найти скалярное произведение. Если дан скаляр, вы хотите масштабировать весь вектор.

Проверка, является ли что-то int, float, long, bool раздражает и не охватывает определенные пользователем объекты, которые могут действовать как числа. Но проверка на __mul__, например, недостаточно хороша, потому что класс векторов, который я только что описал, определил бы __mul__, но это не тот тип числа, который я хочу.

Ответы [ 12 ]

0 голосов
/ 06 декабря 2014

У меня была похожая проблема при реализации своего рода векторного класса. Один из способов проверить число - это просто преобразовать его в один, то есть с помощью

float(x)

Это должно отклонить случаи, когда x не может быть преобразовано в число; но может также отклонять другие типы числовых структур, которые могут быть действительными, например, комплексные числа.

0 голосов
/ 09 августа 2010

Для гипотетического векторного класса:

Предположим, v - это вектор, и мы умножаем его на x.Если имеет смысл умножить каждый компонент v на x, мы, вероятно, имели в виду это, поэтому попробуйте сначала.Если нет, может быть, мы можем расставить все точки?В противном случае это ошибка типа.

EDIT - приведенный ниже код не работает, потому что 2*[0]==[0,0] вместо повышения TypeError.Я оставляю это, потому что это было прокомментировано.

def __mul__( self, x ):
    try:
        return [ comp * x for comp in self ]
    except TypeError:
        return [ x * y for x, y in itertools.zip_longest( self, x, fillvalue = 0 )
...