Uso de DeprecationWarning en Python

Hola!

Contexto

  • Django 3.2
  • Py 3.8

Me encuentro con la necesidad de deprecar una funcionalidad en pos de otra nueva.
Usando algunas librerías de Python suelo ver el uso de DeprecationWarning y me parece que cumple con lo que necesito.

Lo estoy utilizando de esta manera pero el problema es que en el output de la terminal no lo veo.

import warnings
warnings.warn("Deprecado", DeprecationWarning)

Puede tener que ver con la configuración de Logging de Django?

Gracias!

Edit

De la documentación

Ignored by the default warning filters, except in the __main__ module (PEP 565). Enabling the Python Development Mode shows this warning.

Probé con FutureWarning y sale bien pero creo que la que quiero es Deprecation

Hola @Rich,
al parecer warnings.warn() tira la advertencia al sys.stderr. Tendrías que ver a qué está conectado el stderr en Django. ¿Algún archivo de log de wsgi por ej? ¿Qué pasa si hacés print("¡ojo!", file=sys.stderr)? Debería ser lo mismo.

Si realmente querés la advertencia en el logging, creo que deberías conectarlo así:
https://docs.python.org/3/library/logging.html#logging.captureWarnings

Me imagino que la config de Logging tiene algo que ver.
Me gusta eso de captureWarnings. Pruebo y comento que sale.

Gracias manuq!

parece que sí tiene que ver! How to log Python warnings in a Django log file? - Stack Overflow

Hola manuq.

Colgué un poco pero finalmente pude probar algunas cosas.

Probé con la configuración igual a la de SO

  • Me crea el archivo de logs pero queda vacío

Agregué un nuevo logger como está configurado en esa respuesta de SO, cambiando el handler a console.

  • No muestra nada en la consola
import logging

logging.captureWarnings(True)
logger = logging.getLogger(__name__)

warnings.warn("No usar este método", DeprecationWarning)

Con la misma config, agregué una línea que captura el warning y lo “transforma” en error.

  • No me termina de servir porque frena la ejecución del programa
import logging

logging.captureWarnings(True)
logger = logging.getLogger(__name__)

warnings.simplefilter("error", DeprecationWarning)
warnings.warn("No usar este método", DeprecationWarning)

Con esto último entiendo que el Warning está siendo captado. Me falta saber adónde está yendo a parar ese bendito log :face_exhaling:

Logging configuration
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "{levelname} {asctime} {module} {filename} {funcName}.{lineno}: {message}",
            "style": "{",
        },
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "verbose",
            # Por defecto el level es INFO, lo que hace que se descarten
            # los mensajes DEBUG si los queremos activar en producción
            "level": "DEBUG"
        },
    },
    "loggers": {
        "root": {
            "handlers": ["console"],
            "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"),
        },
        'py.warnings': {
            'handlers': ['console'],
            'level': 'WARNING',
            'propagate': True
        }
    }
}
1 me gusta