Skip to content

Kontrolle (Ignorieren/Anzeigen) von Warnungen in Python

Python

In Python can SIE das Warnungsmodul in der Standardbibliothek verwenden, um Warnungen zu steuern, z. B. Warnungen zu versehentlich oder übereinstimmende Warnungen in Ausnahmen umzuwandeln.

Dieser Artikel hat folgenden Inhalt.

  • Beispiele für Warnungen
  • Warnungen ignoriert
    • Ignorieren Sie alle Warnungen
    • Geben Sie zu irrtümliche Warnungskategorien an
  • Behandeln Sie Warnungen als Ausnahmen
  • Warnungen vorübergehend kontrollieren

Das Warnungsmodul bietet auch warn() zum Ausgeben von Warnungen, aber dieser Artikel behandelt es nicht. Bitte SIE sterben offizielle Dokumentation, WENN SIE Warnungen in Ihren eigenen Funktionen ausgeben möchten.

Beispiele für Warnungen

Verwenden Sie FutureWarning mit ix[] in Pandas und SettingWithCopyWarning mit der verketteten Zuweisung.

import warnings
import pandas as pd

df = pd.DataFrame([[0, 1, 2], [3, 4, 5]])

df.ix[0, 0] = 0
# /usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: 
# .ix is deprecated. Please use
# .loc for label based indexing or
# .iloc for positional indexing
# 
# See the documentation here:
# http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated
#   """Entry point for launching an IPython kernel.

df.iloc[:1][0] = 0
# /usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame.
# Try using .loc[row_indexer,col_indexer] = value instead
# 
# See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
#   """Entry point for launching an IPython kernel.

Beachten Sie, dass ix[] AttributeError in Pandas-Version 1.4 im April 2022 auslöst. Der Code in diesem Artikel wurde in einer bevorzugten Version ausgeführt.

Warnungen ignoriert

Verwenden Sie warnings.simplefilter(), um die Behandlung von Warnungen zu ändern, und warnings.resetwarnings(), um sie zurückzusetzen.

Ignorieren Sie alle Warnungen

Alle Warnungen werden ignoriert, indem der erste Parameter von warnings.simplefilter(), action, auf „ignore“ gesetzt wird.

warnings.simplefilter('ignore')

df.ix[0, 0] = 0

df.iloc[:1][0] = 0

In der offiziellen Dokumentation FINDEN SIE sterben Warnfilter, sterben SIE für Aktionen festlegen can.

Geben Sie zu irrtümliche Warnungskategorien an

Sie können eine Warnungskategorie im zweiten Parameter von warnings.simplefilter(), category, angeben.

Zu den Warnkategorien gehören FutureWarning, DeprecationWarning, SyntaxWarning, RuntimeWarning usw.

Die Kategorie ist standardmäßig Warnung, die Basisklasse für alle Warnungskategorieklassen. Wie im Beispiel Beispiel werden standardmäßig alle Warnungen abgedeckt.

Warnkategorien werden in der Warnmeldung beschrieben. Wie oben erwähnt, gibt es ix[] FutureWarning und verkettete Zuweisungsprobleme SettingWithCopyWarning aus.

Wenn beispielsweise category=FutureWarning ist, Werden Warnungen für ix[] deaktiviert, aber Warnungen für verkettete Zuweisungen werden weiterhin ausgegeben.

warnings.resetwarnings()

warnings.simplefilter('ignore', FutureWarning)

df.ix[0, 0] = 0

df.iloc[:1][0] = 0
# /usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame.
# Try using .loc[row_indexer,col_indexer] = value instead
# 
# See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
#   """Entry point for launching an IPython kernel.

Die Warnkategorie SettingWithCopyWarning durch verkettete Zuweisung ist in Pandas definiert. Sie müssen pd.core.common.SettingWithCopyWarning angeben, nicht SettingWithCopyWarning.

warnings.resetwarnings()

# warnings.simplefilter('ignore', SettingWithCopyWarning)
# NameError: name 'SettingWithCopyWarning' is not defined

warnings.simplefilter('ignore', pd.core.common.SettingWithCopyWarning)

df.ix[0, 0] = 0
# /usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: 
# .ix is deprecated. Please use
# .loc for label based indexing or
# .iloc for positional indexing
# 
# See the documentation here:
# http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated
#   """Entry point for launching an IPython kernel.

df.iloc[:1][0] = 0

Behandeln Sie Warnungen als Ausnahmen

Im Gegensatz zu Ausnahmen läuft der Prozess weiter, auch wenn eine Warnung ausgegeben wird.

Wenn Sie den Prozess für Warnungen wie Ausnahmen stoppen möchten, setzen Sie die Aktion von warnings.simplefilter() auf „error“.

warnings.resetwarnings()

warnings.simplefilter('error')

# df.ix[0, 0] = 0
# FutureWarning: ...

Der zweite Parameter, Kategorie, kann used Werden, um die Warnungskategorie anzugeben, auf die abgezielt werden soll. Sie können auch separate Aktionen für jede Kategorie festlegen.

warnings.resetwarnings()

warnings.simplefilter('ignore', FutureWarning)
warnings.simplefilter('error', pd.core.common.SettingWithCopyWarning)

df.ix[0, 0] = 0

# df.iloc[:1][0] = 0
# SettingWithCopyWarning: ...

Warnungen vorübergehend kontrollieren

If SIE Warnungen vorübergehend kontrollieren möchten, verwenden SIE with und warnings.catch_warnings().

Die Einstellung durch warnings.simplefilter() wirkt nur innerhalb des with-Blocks.

warnings.resetwarnings()

with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    df.ix[0, 0] = 0

df.ix[0, 0] = 0
# /usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: 
# .ix is deprecated. Please use
# .loc for label based indexing or
# .iloc for positional indexing
# 
# See the documentation here:
# http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated
#   """Entry point for launching an IPython kernel.