Skip to content

Controllare (ignorare/visualizzare) gli avvisi in Python

Python

In Python, puoi usare il modulo degli avvisi nella libreria standard per controllare gli avvisi, come ignorare gli avvisi o passare gli avvisi in eccezioni.

In questo articolo vengono descritti i seguenti contenuti.

  • Esempi di avvertenze
  • Ignora gli avvisi
    • Ignora tutti gli avvisi
    • Specifica le categorie di avviso da ignorare
  • Considera gli avvisi come eccezioni
  • Controllare temporaneamente gli avvisi

Il modulo warnings articolo fornisce anche warn() per emettere avvisi, ma questo non lo tratta. Fare riferimento alla documentazione ufficiale se si desidera emettere avvisi nelle proprie funzioni.

Esempi di avvertenze

Usa FutureWarning con ix[] nei panda e SettingWithCopyWarning con l’assegnazione concatenata.

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.

Si noti che ix[] solleva AttributeError in Pandas versione 1.4 nell’aprile 2022. Il codice in questo articolo è stato eseguito su una versione precedente.

Ignora gli avvisi

Utilizzare warnings.simplefilter() per modificare la gestione degli avvisi e warnings.resetwarnings() per reimpostare.

Ignora tutti gli avvisi

Tutti gli avvisi vengono ignorati impostando il primo parametro di warnings.simplefilter(), action, su ‘ignore’.

warnings.simplefilter('ignore')

df.ix[0, 0] = 0

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

Consulta la documentazione ufficiale per i filtri di avviso che puoi impostare per l’azione.

Specifica le categorie di avviso da ignorare

È possibile specificare una categoria di avviso nel secondo parametro di warnings.simplefilter(), categoria.

Le categorie di avviso relative a FutureWarning, DepcationWarning, SyntaxWarning, RuntimeWarning, ecc.

L’impostazione predefinita della categoria è Avviso, la classe base per tutte le classi di categoria di avviso. Come nell’esempio sopra, per la dotazione predefinita, tutti gli avvisi sono coperti.

Le categorie di avvertenza sono nel messaggio di avvertenza. Come accennato in precedenza, ix[] emette FutureWarning e problemi di assegnazione concatenata SettingWithCopyWarning.

Ad esempio, se category=FutureWarning, gli avvisi per ix[] sono disabilitati, ma gli avvisi per le assegnazioni concate vengono comunque emessi.

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.

La categoria di avviso SettingWithCopyWarning per assegnazione concatenata è definita in panda. È necessario specificare ppd.core.common.SettingWithCopyWarning, non 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

Considera gli avvisi come eccezioni

A differenza delle eccezioni, il processo continua a essere eseguito, anche se viene emesso un avviso.

Se vuoi interrompere il processo per avvisi come eccezioni, imposta l’azione di warnings.simplefil() su ‘error’.

warnings.resetwarnings()

warnings.simplefilter('error')

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

Il secondo parametro, categoria, può essere utilizzato per specificare la categoria di avviso di destinazione. Puoi anche specificare separatamente per ciascuna categoria di azioni.

warnings.resetwarnings()

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

df.ix[0, 0] = 0

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

Controllare temporaneamente gli avvisi

Se vuoi controllare temporaneamente gli avvisi, usa con e warnings.catch_warnings().

L’impostazione di warnings.simplefilter() è efficace solo all’interno del blocco con.

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.