2013-04-26 8 views
12

Wykonywanie skryptu Pythona (sposób, aby tę funkcję zawrzeć w tym miejscu) Napisałem komunikaty do komunikatu ostrzegawczego. Nie wiem, w której linii w moim kodzie jest to podniesione. Jak mogę uzyskać te informacje?UserWarning: konwersja zamaskowanego elementu na nan

Co to dokładnie oznacza? Właściwie to nie wiedziałem, że używam jakiejś maski maskowanej?

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

bym umieścić wiele instrukcji 'print' dotyczących wszystkich możliwych winowajców w twoim kodzie, da ci to czas na to, co się dzieje, gdzieś pomiędzy twoim' wydrukiem' zobaczysz to ostrzeżenie, w ten sposób możesz zlokalizować swój problem. Jeśli to pomaga, ostrzeżenie pochodzi od 'MaskedArray .__ float__', które najwyraźniej przekształca tablicę na float. Innym sposobem jest (tymczasowe) edytowanie 'core.py', aby wyprowadzić z niego użyteczne informacje, takie jak atrybuty tablicy. Debugery są również realną opcją. – gatto

+0

Instrukcje drukowania pomogły mi znaleźć odpowiednią linię, thx! Po prostu pomyślałem, że może być bardziej wyrafinowane rozwiązanie. – HyperCube

Odpowiedz

11

Możesz użyć modułu warnings do konwersji ostrzeżeń na wyjątki. Najprostsza metoda nazywa się simplefilter. Oto przykład; kod, który generuje ostrzeżenie, znajduje się w func2b(), więc istnieje niezrównany traceback.

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

Gdy linia zawierająca wezwanie do simplefilter jest wypowiedziało się, wyjście jest

func1 
warning_to_exception.py:13: UserWarning: uh oh 
    warnings.warn("uh oh") 
func2 
func3 

Mając to linia włączone, można dostać traceback:

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 
2

Możliwe jest również, aby załatać MaskedArray.__float__ tak, że zgłasza wyjątek, w ten sposób będzie można zobaczyć ślad stosu, który będzie zawierać kod. I łatanie może być wykonane w twoim kodzie, nie musisz zadzierać z .../ma/core.py.

Przykład 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() 

i wyjście:

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 

Jak widać to pokazuje linię z m.squeeze().