2010-01-13 4 views
7

En Python 2.6, il est possible de supprimer les avertissements du module avertissements en utilisantavertissements Attraper pré-python 2.6

with warnings.catch_warnings(): 
    warnings.simplefilter("ignore") 
    fxn() 

Les versions de Python avant 2.6 ne prennent pas en charge with cependant, je me demande si alternatives à ce qui précède qui fonctionnerait avec les versions antérieures à 2.6?

Répondre

3

Ceci est similaire:

# Save the existing list of warning filters before we modify it using simplefilter(). 
# Note: the '[:]' causes a copy of the list to be created. Without it, original_filter 
# would alias the one and only 'real' list and then we'd have nothing to restore. 
original_filters = warnings.filters[:] 

# Ignore warnings. 
warnings.simplefilter("ignore") 

try: 
    # Execute the code that presumably causes the warnings. 
    fxn() 

finally: 
    # Restore the list of warning filters. 
    warnings.filters = original_filters 

Edit: Sans try/finally, les filtres d'avertissement d'origine ne seraient pas restaurées si fxn() a lancé une exception. Voir PEP 343 pour plus de discussion sur la façon dont l'instruction with sert à remplacer try/finally lorsqu'il est utilisé comme ceci.

+0

Merci! Pourriez-vous expliquer comment et pourquoi cela fonctionne? – astrofrog

+0

Morgoth: Il fait une copie des filtres, les modifie, appelle fxn, et finalement réinitialise les filtres à la valeur d'origine. À peu près la même chose que le gestionnaire de contexte 2.6 fait. –

+0

Merci pour l'explication - pourquoi l'essai ... est-il finalement nécessaire? – astrofrog

-1

En fonction de la version minimale dont vous avez besoin pour soutenir l'utilisation

from __future__ import with_statement 

pourrait être une option de Python 2.5, sinon vous aurez probablement besoin pour revenir sur ce qui a suggéré Jon.

+3

Comme Pär Wieslander m'a fait remarquer quand j'ai essayé cette réponse (que je vois maintenant je ne devrais pas avoir supprimé), 'catch_warnings()' a été introduit dans 2.6, donc dans ce cas, juste avoir l'instruction with n'aide pas (sauf si vous voulez copier l'implémentation de 'catch_warnings()'. –