emp*_*ice 9 python numpy python-2.7
我有一段代码可以在大多数时间内完美运行,但每隔一段时间我就会在traceback中得到这个错误:
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
Run Code Online (Sandbox Code Playgroud)
我知道什么issubclass()
做并理解错误,但我从来没有打过它; 代码中的那一行是纯算术,所以我不知道为什么这首先TypeError
是提出来的.我唯一的理论是Numpy在幕后调用它,但是追溯应该显示Numpy源中有问题的一行,对吧?这是怎么回事?
更新:
wv
是一个浮点数组,sm2
是一个浮点数.该错误实际上是由numpy.log
(新)行引发的
tmp = numpy.log(2. * numpy.pi * sm2)
Run Code Online (Sandbox Code Playgroud)
但是,错误消息中不再提供更多信息.
更多更新:
我当前的Numpy版本(来自Python提示):
>>> import numpy
>>> numpy.__version__
'1.6.2'
Run Code Online (Sandbox Code Playgroud)
我将问题行更改为
try:
tmp = numpy.log(2. * numpy.pi * sm2)
except TypeError:
print type(sm2), 2. * numpy.pi * sm2
Run Code Online (Sandbox Code Playgroud)
得到了输出
<type 'numpy.float64'> 0.0
Run Code Online (Sandbox Code Playgroud)
所以有意义的是会出现某种错误,但如果我这样做(在Python提示符下)
>>> import numpy
>>> numpy.log(0.)
Run Code Online (Sandbox Code Playgroud)
我得到了我期望的错误(并且已经通过warning
模块处理了相关代码):
__main__:1: RuntimeWarning: divide by zero encountered in log
-inf
Run Code Online (Sandbox Code Playgroud)
毕竟这是我的代码中的一个错误...正如@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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
不管怎样,它都有效,尽管 Python确实应该抛出某种异常来将字符串而不是类传递给warnings.simplefilter
.