2010-02-02 16 views
22

Ich gebe viele Warnungen in einem Validierer aus, und ich möchte alles in stdout außer der Nachricht unterdrücken, die an warnings.warn() geliefert wird.Python: Nur die Nachricht auf Warnungen drucken

Ie, jetzt sehe ich:

./file.py:123: UserWarning: My looong warning message 
some Python code 

Ich möchte, dies sehen:

My looong warning message 

Edit 2: Zwingende warnings.showwarning() stellte sich heraus, an die Arbeit:

def _warning(
    message, 
    category = UserWarning, 
    filename = '', 
    lineno = -1): 
    print(message) 
... 
warnings.showwarning = _warning 
warnings.warn('foo') 

Antwort

13

Monkeypatch warnings.showwarning() mit Ihrer eigenen benutzerdefinierten Funktion Ion.

+5

Haben Sie den Link gelesen? Und ich zitiere: "Sie können diese Funktion durch eine alternative Implementierung ersetzen, indem Sie zu warnings.showwarning zuweisen.". Das Handbuch * selbst * empfiehlt, das Modul zu montieren. –

+0

Mach dir keine Sorgen, es ist völlig normal Python-Verfahren, überhaupt nicht drastisch. –

12

Es ist immer monkeypatching:

import warnings 

def custom_formatwarning(msg, *a): 
    # ignore everything except the message 
    return str(msg) + '\n' 

warnings.formatwarning = custom_formatwarning 
warnings.warn("achtung") 
+0

auf Python 3.6 Ich bekomme TypeError: custom_formatwarning() hat ein unerwartetes Schlüsselwort Argument 'Zeile'. Also habe ich die Funktionssignatur folgendermaßen geändert: 'def custom_formatwarning (message, category, filename, linerno, line = '')' –

+0

Ich hatte in Python 3.6 die "selbe hat ein unerwartetes Schlüsselwort Argument 'Zeile" ", aber ich habe nur die Signatur geändert 'def custom_formatwarning (msg, * a, ** b): 'so fängt es auch Schlüsselwortarg. – SuperGeo

6

Verwenden Sie die logging module statt warnings.

+0

Dies ist, was ich in der überwiegenden Mehrheit der Situationen, in denen ich ursprünglich versucht hatte, "Warnungen" zu verwenden. Wenn Sie mit Warnungen zu kämpfen haben, sollten Sie diese Option in Erwägung ziehen. Ernst. – tripleee

6

Hier ist, was ich tun, nur die Quellcodezeile weglassen. Dies ist im Großen und Ganzen wie von der Dokumentation vorgeschlagen, aber es war ein bisschen ein Kampf um herauszufinden, was genau zu ändern ist. (Insbesondere habe ich versucht, auf verschiedene Weise aus showwarnings die Source-Leitung zu halten, aber konnte es nicht den Weg zur Arbeit wollte ich.)

# Force warnings.warn() to omit the source code line in the message 
formatwarning_orig = warnings.formatwarning 
warnings.formatwarning = lambda message, category, filename, lineno, line=None: \ 
    formatwarning_orig(message, category, filename, lineno, line='') 

Gerade line=None vorbei wäre Python verursachen filename und lineno verwenden finde einen Wert für line automatisch heraus, aber das Übergeben einer leeren Zeichenfolge behebt das stattdessen.

+0

Ich weiß, das ist super alt, aber ich habe eine ähnliche Sache gemacht und das hat auch funktioniert. Wenn ich dies jedoch innerhalb einer Funktion tue, ändert sich das Warnverhalten im globalen Gültigkeitsbereich. Jede Warnung kommt nach dem Aufruf, dass die Funktion das geänderte Verhalten annimmt. Kennen Sie einen Weg, um seine Wirkung zu begrenzen? – percusse

+0

Hmm, ich habe das nur im globalen Kontext verwendet. Um dies zu umgehen, könnten Sie eine globale Variable definieren, die innerhalb des 'Lambda' verwendet wird, um zu entscheiden, ob der 'line'-Wert überschrieben wird oder nicht. (An diesem Punkt vielleicht eine benannte Funktion anstelle eines "Lambda" verwenden?) – tripleee

+0

Leider war es egal, wo ich diese Dinge tat. Ich habe auch versucht, die ursprüngliche Strafe zu retten und wiederherzustellen, aber noch keinen Nutzen. – percusse