- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一段代码在大部分时间都运行得很好,但每隔一段时间我就会在回溯中遇到这个错误:
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
是一个 float 组,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
最佳答案
毕竟这是我的代码中的一个错误...正如@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
。
关于当从未调用 issubclass() 时,Python 在 issubclass() 上抛出 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128251/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!