21

执行我写的python脚本(在这里包含很长的方法)会导致一条警告消息。我不知道这是在我的代码中的哪一行提出的。我怎样才能得到这些信息?

此外,这究竟意味着什么?事实上,我不知道我正在使用某种蒙面数组?

/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.")
4

2 回答 2

21

您可以使用该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
于 2013-04-26T13:39:16.477 回答
3

也可以进行修补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().

于 2013-04-26T13:30:11.880 回答