У меня была одна и та же проблема, потому что я переместил местоположение проекта и просто нуждался в воссоздании виртуального каталога.
Как другие ответили, могли быть другие числовые типы помимо тех, Вы упоминаете. Один подход должен был бы проверить явно на возможности, которые Вы хотите, с чем-то как
# Python 2
def is_numeric(obj):
attrs = ['__add__', '__sub__', '__mul__', '__div__', '__pow__']
return all(hasattr(obj, attr) for attr in attrs)
# Python 3
def is_numeric(obj):
attrs = ['__add__', '__sub__', '__mul__', '__truediv__', '__pow__']
return all(hasattr(obj, attr) for attr in attrs)
Это работает на все Ваши примеры кроме последнего, numpy.array(['1'])
. Поэтому numpy.ndarray
имеет специальные методы для числовых операций, но повышает TypeError, при попытке использовать их неуместно со строкой или объектными массивами. Вы могли добавить явную проверку на это как
... and not (isinstance(obj, ndarray) and obj.dtype.kind in 'OSU')
, Это может быть достаточно хорошо.
, Но... Вы никогда не можете быть 100% уверены, что кто-то не определит другой тип с тем же поведением, таким образом, более надежный путь будет состоять в том, чтобы на самом деле попытаться сделать вычисление и поймать исключение, что-то как
def is_numeric_paranoid(obj):
try:
obj+obj, obj-obj, obj*obj, obj**obj, obj/obj
except ZeroDivisionError:
return True
except Exception:
return False
else:
return True
, но в зависимости от того, как часто Вы планируете назвать использование им и с тем, какие аргументы, это не может быть практично (это может быть потенциально медленно, например, с большими массивами).
В целом гибкое, быстро, и pythonic способ обработать неизвестные типы должны просто выполнить некоторую операцию на них и поймать исключение на недопустимых типах.
try:
a = 5+'5'
except TypeError:
print "Oops"
Кажется мне, что этот подход легче, чем специальное преобразование регистра некоторая функция для определения абсолютной уверенности типа.
Ваш is_numeric
является неточным. См. мои комментарии к своему вопросу.
Другие числовые типы могли быть: long
, complex
, fractions.Fraction
, numpy.bool_
, numpy.ubyte
...
operator.isNumberType()
возвраты True
для чисел Python и numpy.array
.
Начиная с Python 2.6 можно использовать isinstance(d, numbers.Number)
вместо устаревшего operator.isNumberType()
.
Обычно лучше проверить возможности объекта (например, можно ли добавить целое число к нему), и не его тип.
Также, numpy имеет numpy. Isreal
и другие аналогичные функции ( Numpy.is
+ Tab должны перечислять их).
Все они имеют свои веселые угловые случаи, но один из них может быть полезен.
IsinStance (Numpy.int32 (4), номера. Внимание)
Возвращает false
, так что это не совсем работает. Operator.isnumbertype ()
, однако работает на всех вариантах Numpy Numbers, в том числе Numpy.Array ([1])
.