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.