执行python脚本(这里包含long的方式)我写了一条警告信息。我不知道我的代码中的哪一行会被引发。我怎样才能获得这些信息?
此外,这究竟是什么意思?事实上,我不知道我使用的是某种蒙版数组?
/usr/lib/pymodules/python2.7/numpy/ma/core.py:3785: UserWarning: Warning: converting a masked element to nan.
warnings.warn("Warning: converting a masked element to nan.")
答案 0 :(得分:12)
您可以使用warnings
模块将警告转换为例外。最简单的方法称为simplefilter
。这是一个例子;生成警告的代码在func2b()中,因此存在非特异性回溯。
import warnings
def func1():
print "func1"
def func2():
func2b()
print "func2"
def func2b():
warnings.warn("uh oh")
def func3():
print "func3"
if __name__ == "__main__":
# Comment the following line to see the default behavior.
warnings.simplefilter('error', UserWarning)
func1()
func2()
func3()
当包含对simplefilter
的调用的行被注释掉时,输出为
func1
warning_to_exception.py:13: UserWarning: uh oh
warnings.warn("uh oh")
func2
func3
包含该行后,您将获得追溯:
func1
Traceback (most recent call last):
File "warning_to_exception.py", line 23, in <module>
func2()
File "warning_to_exception.py", line 9, in func2
func2b()
File "warning_to_exception.py", line 13, in func2b
warnings.warn("uh oh")
UserWarning: uh oh
答案 1 :(得分:2)
也可以修补MaskedArray.__float__
以便它引发异常,这样你就会看到堆栈跟踪,其中包括你的代码。修补可以在您的代码中完成,无需弄乱.../ma/core.py
。
squeeze()
的示例:
import numpy as np
from numpy import ma
def raise_me(*args, **kw):
raise Exception('ping')
ma.MaskedArray.squeeze = raise_me
def test():
x = np.array([(1, 1.), (2, 2.)], dtype=[('a',int), ('b', float)])
m = x.view(ma.MaskedArray)
m.squeeze()
def main():
test()
main()
输出:
Traceback (most recent call last):
File "t.py", line 19, in <module>
main()
File "t.py", line 17, in main
test()
File "t.py", line 13, in test
m.squeeze()
File "t.py", line 6, in raise_me
raise Exception('ping')
Exception: ping
如您所见,它会显示m.squeeze()
行。