Necesito marcar las rutinas como obsoletas, pero aparentemente no hay un decorador de biblioteca estándar para la obsolescencia. Conozco las recetas y el módulo de advertencias, pero mi pregunta es: ¿por qué no hay un decorador de biblioteca estándar para esta tarea (común)?
Pregunta adicional: ¿hay decoradores estándar en la biblioteca estándar?
Respuestas:
Aquí hay un fragmento, modificado de los citados por Leandro:
Debido a que en algunos intérpretes la primera solución expuesta (sin manejo del filtro) puede provocar una supresión de advertencia.
fuente
functools.wraps
lugar de establecer el nombre y el documento de esa manera?Aquí hay otra solución:
Este decorador (una fábrica de decoradores de hecho) le permite dar un mensaje de razón . También es más útil para ayudar al desarrollador a diagnosticar el problema al proporcionar el nombre de archivo de origen y el número de línea .
EDITAR : Este código utiliza la recomendación de Zero: reemplaza la
warnings.warn_explicit
línea porwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
, que imprime el sitio de llamada de función en lugar del sitio de definición de función. Facilita la depuración.EDIT2 : esta versión permite al desarrollador especificar un mensaje opcional de "razón".
Puede usar este decorador para funciones , métodos y clases .
Aquí hay un ejemplo simple:
Obtendrás:
EDITAR3: este decorador ahora es parte de la biblioteca obsoleta:
Nueva versión estable v1.2.10 🎉
fuente
warn_explicit
línea con lawarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
que imprime el sitio de llamada de función en lugar del sitio de definición de función. Facilita la depuración.Como sugirió muon , puede instalar el
deprecation
paquete para esto.Instalación
Ejemplo de uso
Consulte http://deprecation.readthedocs.io/ para obtener la documentación completa.
fuente
Supongo que la razón es que el código Python no puede procesarse estáticamente (como lo hizo para los compiladores de C ++), no puede recibir advertencias sobre el uso de algunas cosas antes de usarlo realmente. No creo que sea una buena idea enviar un correo no deseado al usuario de su script con un montón de mensajes "Advertencia: este desarrollador de este script está utilizando una API obsoleta".
Actualización: pero puedes crear un decorador que transformará la función original en otra. La nueva función marcará / comprobará el interruptor indicando que ya se llamó a esta función y mostrará un mensaje solo al encender el interruptor. Y / o al salir, puede imprimir una lista de todas las funciones obsoletas utilizadas en el programa.
fuente
Puedes crear un archivo utils
Y luego importe el decorador de desuso de la siguiente manera:
fuente
ACTUALIZACIÓN: Creo que es mejor, cuando mostramos DeprecationWarning solo la primera vez para cada línea de código y cuando podemos enviar algún mensaje:
Resultado:
Simplemente podemos hacer clic en la ruta de advertencia e ir a la línea en PyCharm.
fuente
Aumentando esta respuesta de Steven Vascellaro :
Si usa Anaconda, primero instale el
deprecation
paquete:Luego pegue lo siguiente en la parte superior del archivo
Consulte http://deprecation.readthedocs.io/ para obtener la documentación completa.
fuente