2010-01-13 24 views
7

En Python 2.6 es posible suprimir las advertencias del módulo de avisos mediante el uso deadvertencias pre-Python 2.6

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

versiones de Python antes 2.6 no son compatibles con with sin embargo, por lo que estoy preguntando si hay alternativas a las anteriores que funcionarían con las versiones anteriores a 2.6?

Respuesta

3

Esto es similar:

# 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 

Editar: Sin la try/finally, los filtros de alerta originales no serían restaurados si FXN() inició una excepción. Consulte PEP 343 para obtener más información sobre cómo la declaración with sirve para reemplazar try/finally cuando se utiliza de esta manera.

+0

Gracias! ¿Podría explicar cómo y por qué funciona esto? – astrofrog

+0

Morgoth: Hace una copia de los filtros, los modifica, llama a fxn y finalmente restablece los filtros al valor original. Más o menos exactamente lo mismo que hace el administrador de contexto 2.6. –

+0

Gracias por la explicación: ¿por qué es el intento ... finalmente necesario? – astrofrog

-1

Dependiendo de lo que la versión mínima que necesita para apoyar el uso de Python 2,5

from __future__ import with_statement 

podría ser una opción, de lo contrario es probable que necesite para el repliegue a lo sugerido Jon.

+3

Como Pär Wieslander me señaló cuando probé esta respuesta (que ahora veo que no debería haber eliminado), 'catch_warnings()' se introdujo en 2.6, por lo que en este caso, simplemente tener la declaración con no ayuda (a menos que desee copiar la implementación de 'catch_warnings()'. –