9

ほとんどの場合完全に実行されるコードがありますが、時々、トレースバックでこのエラーが発生します。

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、floatスカラーです。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
4

1 に答える 1

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.seterrRuntimeWarningただし、この方法で処理する代わりの方法を提供します。

>>> 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

于 2013-01-02T22:27:27.083 に答える