Python y sus librerías es un ecosistema en continua evolución. Cada nueva versión de Python, o cualquiera de sus librerías, incluye nuevas características, mejoras de rendimiento y soluciona posibles errores. En la mayoría de los casos los cambios no afectan al funcionamiento del código existente, pero en otros casos si. Cuando se van a introducir cambios que pueden afectar al funcionamiento de las funciones, o como se deben llamar a estas, lo normal es incluir las advertencias conocidas como FutureWarning. En esta entrada, se analizará qué son los errores FutureWarning en Python y cómo abordarlos de manera efectiva.
¿Qué es un FutureWarning en Python?
Los mensajes FutureWarning en Python son advertencias que se emiten cuando se ejecuta unas características que están en desuso o que cambiarán en futuras versiones. Indicando a los desarrolladores que deben actualizar su código para prepararlo de cara a futuras versiones. Estos mensajes no detienen la ejecución del código, ya que no son un error sino una advertencia, y su única función es la de recordar los futuros cambios. A pesar de ello, es necesario tenerlos en cuenta cuando aparecen para evitar que los programas dejen de funcionar en una futura actualización de Python o la de librería que genera el mensaje.
Tipos comunes de FutureWarning
Las advertencias FutureWarning se pueden clasificar en diferentes tipos de categorías.
Advertencia de obsolescencia
Posiblemente el tipo de FutureWarning más habitual es la advertencia de obsolescencia de una función o un atributo. Lo que indica que una característica específica que se está usando en el código está en desuso. Cuando aparecen estos mensajes se recomienda actualizar el código tan pronto sea posible para usar la nueva sintaxis.
Por ejemplo, el siguiente mensaje indica que la función get_feature_names
ha pasado a estar obsoleta y se eliminará en una versión futura versión de Scikit-learn.
FutureWarning: Function get_feature_names is deprecated; get_feature_names is deprecated in 1.0 and will be removed in 1.2. Please use get_feature_names_out instead.
Para poder usar el código con scikit-learn 1.2 será necesario cambiar todas las llamadas a get_feature_names
por llamadas a get_feature_names_out
. Revisando la documentación de las funciones para adaptar las llamadas. Aunque esto no es gratis, como la función get_feature_names_out
se introdujo en la versión 1.0, al realizar el cambio no se podrá ejecutar el código actualizado en versiones previas. Por lo que será necesario informar a los usuarios de los que ya no será posible utilizar el código en versiones anteriores.
Otra opción es que el cambio se de en el un parámetro de la función, como el siguiente ejemplo.
FutureWarning: Attribute `affinity` was deprecated in version 1.2 and will be removed in 1.4. Use `metric` instead
En este caso, el parámetro affinity
desaparecerá en la versión 1.4 de Scikit-learn reemplazó por metric
. Al igual que el caso anterior es necesario cambiar la llamada a la función.
Cambio en el valor predeterminado
Mediante un mensaje FutureWarning también se puede indicar cambios en los valores predeterminados de los parámetros de funciones. El siguiente ejemplo es de scikit-learn.
FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning super()._check_params_vs_input(X, default_n_init=10)
Este mensaje indica que el valor por defecto actual de n_init
es 10, pero en la versión 1.4 pasará a ser 'auto'
. Aconsejando establecer explícitamente el valor de n_init
para suprimir la advertencia. A diferencia del caso anterior en este caso el código va a seguir funcionando cuando llegue la versión 1.4 de la librería, pero los resultados pueden cambiar ya que hay un cambio en un parámetro. Por lo que se debe seguir el consejo para evitar que en una futura versión el funcionamiento del programa cambie.
Consejos para gestionar los errores FutureWarning en Python
Los mensajes FutureWarning no son un problema inminente en Python, pero ignorarlos puede hacer que el código deje de funcionar en una actualización. Cuando se tiene un mensaje de este tipo es aconsejable seguir los siguientes pasos:
- Leer la documentación: Antes de realizar cambios en el código se debe consultar a la documentación para comprender la razón detrás del FutureWarning. Lo que proporcionará la información necesaria sobre la nueva sintaxis o función.
- Actualiza el código: Una vez comprendida la naturaleza de la advertencia, actualiza el código en base a las recomendaciones. Aprovechando la ocasión para mejorar y optimizar el código.
- Realizar pruebas exhaustivas: Después de aplicar los cambios será necesario realizar pruebas exhaustivas para asegurar que el código actualizado funcione como se espera. Algo crucial para evitar posibles problemas cuando se ponga en producción.
Supresión selectiva de los FutureWarning
En algunos casos, se puede optar por suprimir temporalmente las advertencias si se está seguro de que el código es compatible y las actualizaciones no son necesarias de inmediato. Siendo algo que se debe hacer con extrema precaución y documentando claramente el motivo. Si el código no es compatible y se ignora el mensaje en código dejará de funcionar en un futuro.
Para realizar una supresión selectiva de los mensajes se puede usar el siguiente código.
import warnings # Suprimir la advertencia específica warnings.filterwarnings("ignore", category=FutureWarning, module="nombre_de_la_biblioteca")
En donde se debe reemplazar “nombre_de_la_biblioteca” por el nombre de la librería de la que se desea anular los mensajes.
Lanzar FutureWarning es librerías propias
Los mensajes FutureWarning se pueden lanzar desde cualquier librería o función escrita en Python. De hecho, es aconsejable usarlos cuando se planea realizar un cambio que puede afectar al funcionario de esta en una futura versión. Facilitando a los usuarios el cambio entre versiones. Para ello solamente se tiene que importar el módulo warnings y lanzar una warnig con FutureWarning
como segundo parámetro. Un ejemplo básico de esto sería el que se muestra a continuación.
import warnings def deprecated_function(): # Emitir una advertencia de depreciación warnings.warn("La función 'deprecated_function' está obsoleta y será eliminada en la próxima versión.", FutureWarning) # Resto del código de la función... deprecated_function()
FutureWarning: La función 'deprecated_function' está obsoleta y será eliminada en la próxima versión. warnings.warn("La función 'deprecated_function' está obsoleta y será eliminada en la próxima versión.", FutureWarning)
Conclusiones
Los errores FutureWarning en Python son un recordatorio de la evolución constante del ecosistema. Al que es necesario adaptarse para disfrutar de las últimas novedades y mejoras. Los desarrolladores que abordan estas advertencias de manera proactiva pueden mantener el código actualizado y asegurar la compatibilidad con las futuras versiones. La clave radica en comprender la naturaleza de la advertencia, actualizar el código en consecuencia y realizar pruebas exhaustivas para garantizar un código robusto y sin problemas.
Imagen de Pete Linforth en Pixabay
Deja una respuesta