Python бросает TypeError на issubclass (), когда issubclass () никогда не вызывается
у меня есть кусок кода, который работает отлично большую часть времени, но время от времени я получаю эту ошибку в обратной трассировке:
File "/path/to/somefile.py", line 272, in somefile
sm = -0.5 * (wv[0]**2. / sm2 + numpy.log(2. * numpy.pi * sm2))
TypeError: issubclass() arg 2 must be a class or tuple of classes
Я знаю issubclass()
делает и понимает ошибку, но я никогда не называл ее; эта строка в коде-чистая арифметика, поэтому я не знаю, почему это TypeError
поднимается в первую очередь. Моя единственная теория заключается в том, что Numpy вызывает его за кулисами, но тогда трассировка должна показать проблемную линию в источнике Numpy, верно? Что продолжаешь?
обновления:
wv
представляет собой массив поплавков и sm2
- это вещественное скалярное. Ошибка фактически выбрасывается numpy.log
, т. е. (новой) строки
tmp = numpy.log(2. * numpy.pi * sm2)
дополнительная информация в сообщении об ошибке не указана.
больше обновлений:
моя текущая версия Numpy (из приглашения Python):
>>> import numpy
>>> numpy.__version__
'1.6.2'
Я изменил проблемную строку к
try:
tmp = numpy.log(2. * numpy.pi * sm2)
except TypeError:
print type(sm2), 2. * numpy.pi * sm2
и получил на выходе
<type 'numpy.float64'> 0.0
поэтому имеет смысл, что будет какой-то ошибки, но если я сделаю это (в приглашении Python)
>>> import numpy
>>> numpy.log(0.)
Я получаю ошибку, которую я ожидал бы (и уже обрабатываю в рассматриваемом коде, через warning
модуль):
__main__:1: RuntimeWarning: divide by zero encountered in log
-inf
1 ответов
Это была ошибка в моем коде, в конце концов... Как указывает @seberg, этот код работает нормально:
>>> import numpy
>>> import warnings
>>> numpy.log(0.)
__main__:1: RuntimeWarning: divide by zero encountered in log
-inf
>>> warnings.simplefilter("error", RuntimeWarning) # not "RuntimeWarning"
>>> try:
... numpy.log(0.)
... except RuntimeWarning:
... print "caught"
...
caught
numpy.seterr
предоставляет альтернативу обработке RuntimeWarning
вот так:
>>> import numpy
>>> numpy.seterr(all='raise')
{'over': 'warn', 'divide': 'warn', 'invalid': 'warn', 'under': 'ignore'}
>>> try:
... numpy.log(0.)
... except FloatingPointError:
... print "caught"
...
caught
в любом случае, это работает, хотя Python действительно должен выдавать какое-то исключение для передачи строки вместо класса в warnings.simplefilter
.