Skip to content

Contrôler (ignorer/afficher) les avertissements en Python

En Python, vous pouvez utiliser le module d’avertissements de la bibliothèque standard pour contrôler les avertissements, comme ignorer les avertissements ou transformer les avertissements correspondants en exceptions.

Cet article décrit le contenu suivant.

  • Exemples d’avertissements
  • Ignorer les avertissements
    • Ignorer tous les avertissements
    • Spécifiez les catégories d’avertissement à ignorer
  • Traiter les avertissements comme des exceptions
  • Contrôler temporairement les avertissements

Le module d’avertissements fournit également warn() pour émettre des avertissements, mais cet article ne le couvre pas. Veuillez vous référer à la documentation officielle si vous souhaitez émettre des avertissements dans vos propres fonctions.

Exemples d’avertissements

Utilisez FutureWarning avec ix[] dans les pandas et SettingWithCopyWarning avec l’affectation chaînée.

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.

Notez que ix[] génère AttributeError dans pandas version 1.4 en avril 2022. Le code de cet article a été exécuté sur une version antérieure.

Ignorer les avertissements

Utilisez warnings.simplefilter() pour modifier la gestion des avertissements et warnings.resetwarnings() pour réinitialiser.

Ignorer tous les avertissements

Tous les avertissements sont ignorés en définissant le premier paramètre de warnings.simplefilter(), action, sur ‘ignore’.

warnings.simplefilter('ignore')

df.ix[0, 0] = 0

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

Consultez la documentation officielle pour les filtres d’avertissement que vous pouvez définir pour l’action.

Spécifiez les catégories d’avertissement à ignorer

Vous pouvez spécifier une catégorie d’avertissement dans le second paramètre de warnings.simplefilter(), category.

Les catégories d’avertissement incluent FutureWarning, DeprecationWarning, SyntaxWarning, RuntimeWarning, etc.

La catégorie par défaut est Avertissement, la classe de base pour toutes les classes de catégories d’avertissement. Comme dans l’exemple ci-dessus, par défaut, tous les avertissements sont couverts.

Les catégories d’avertissement sont décrites dans le message d’avertissement. Comme mentionné ci-dessus, ix[] émet FutureWarning et les problèmes d’affectation enchaînés SettingWithCopyWarning.

Par exemple, si category=FutureWarning, les avertissements pour ix[] sont désactivés, mais les avertissements pour les affectations chaînées sont toujours émis.

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 catégorie d’avertissement SettingWithCopyWarning par affectation chaînée est définie dans pandas. Vous devez spécifier pd.core.common.SettingWithCopyWarning, et 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

Traiter les avertissements comme des exceptions

Contrairement aux exceptions, le processus continue de s’exécuter, même si un avertissement est émis.

Si vous souhaitez arrêter le processus pour les avertissements comme les exceptions, définissez l’action de warnings.simplefilter() sur ‘error’.

warnings.resetwarnings()

warnings.simplefilter('error')

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

Le deuxième paramètre, catégorie, peut être utilisé pour spécifier la catégorie d’avertissement à cibler. Vous pouvez également spécifier des actions distinctes pour chaque catégorie.

warnings.resetwarnings()

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

df.ix[0, 0] = 0

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

Contrôler temporairement les avertissements

Si vous souhaitez contrôler temporairement les avertissements, utilisez with et warnings.catch_warnings().

Le paramètre par warnings.simplefilter() n’est effectif qu’à l’intérieur du bloc with.

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.