当从不调用issubclass()时,Python会在issubclass()上抛出TypeError

时间:2013-01-02 19:51:36

标签: python numpy python-2.7

我有一段代码可以在大多数时间内完美运行,但每隔一段时间我就会在追溯中遇到这个错误:

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 个答案:

答案 0 :(得分:3)

毕竟这是我的代码中的错误......正如@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