De Python y sus demonios

El pasado fin de semana estuve asesorando a varios aspirantes que buscan ingresar al programa de maestría en el que soy profesor. Esta asesoría es derivada de las actividades prácticas del curso propedéutico que me tocó impartir para el ingreso, un curso que terminé renombrando simplemente como «Procesamiento y Análisis de Datos».

Si bien Python es un lenguaje de programación idóneo para aprender a programar, también lo es para la introducción y el aprendizaje de muchas otras disciplinas de la computación (estructuras de datos, algoritmos, ciencia de datos, machine learning, entre muchas otras más). No es una panacea y existe una curva de aprendizaje detrás, que no está limitada al lenguaje en sí.

Personalmente, considero que esta curva de aprendizaje está conformada por un conocimiento que debe adquirirse (en este orden) sobre:

  1. La tecnología derivada de Python en general (el intérprete, su instalación e interacción con el sistema operativo anfitrión, entornos de operación).
  2. El lenguaje en sí (enfocándose en la estructura en general de un programa, estructuras de control, declaración y tipos de datos básicos).
  3. Bibliotecas y su uso.

De estos tres podemos decir que el último punto es el más amplio. Tomemos por ejemplo a Pandas, la biblioteca dedicada a las estructuras de paneles de datos. Tan sólo dominar esta biblioteca requiere tiempo y dedicación considerables, superiores a un curso propedéutico. Y así como Pandas, hay muchas otras bibliotecas.

Pero lograr lo anterior no es posible si no se comprende la filosofía y elementos básicos de construcción del lenguaje. Lo que es llamado coloquialmente como «pensamiento» o «estilo» pitónico (y «pitonistas» a quienes lo practican), algo que se aprecia en quienes ya tienen experiencia en el lenguaje. Es muy común ver gente que cuenta ya con experiencia en labores de programación, que traslada esa experiencia a Python. Si bien sus resultados funcionan, ni son «pitónicos» e implican un pobre uso del lenguaje (en el sentido de código rebuscado o lento). Esta parte (de la mencionada curva de aprendizaje) es, en mi opinión, más reducida pero no por ello menos importante. A pesar de las proporciones de los tres puntos mencionados, cada uno es igual de importante y debe ser cabalmente apreciado en el orden indicado.

Por lo que, finalmente, llegamos el primer punto, y cuya importancia radica en que la experiencia con Python no sea una traumática. Este post precisamente se enfoca al respecto y es un recuento de los principales puntos vividos en este fin de semana. Una suerte de «lecciones aprendidas».

  • Python puede ser instalado a «nivel sistema» (disponible para todos los usuarios; lo que encontramos usualmente cuando éste viene ya preinstalado) o a nivel usuario. Mientras que por cierto tiempo esto fue algo a tener en consideración, como fue en el caso de macOS, se ha venido evitando tener este tipo de dependencias a nivel de sistema. Así, pese a que ya puede encontrarse preinstalado Python en el sistema operativo, sus desarrolladores han evitado la dependencia por éste o alguna versión. Esto ha relajado mucho el cuidado que debe tenerse al respecto de este tipo de instalaciones y se presentan algunos problemas como los que aprecié en este fin de semana.
  • Para el caso de macOS, Python, a la par de esa instalación «a nivel sistema«, también puede instalarse o agregarse otra versión del intérprete, mediante un administrador de aplicaciones como MacPorts o Homebrew. Lo que no debería ser problema pero sí debe tenerse cuidado al hacerlo para que esta adición quede debidamente regisitrada con la actualización de PATH y algunas otras variables relacionadas..
  • Por supuesto, hay otras formas de hacerse de Python por primera vez o a la par de una instalación ya presente, que son la respuesta a lo que se relata aquí, pero que no se discutirán por el momento.

Dos problemas se presentaron este fin de semana por los que recibí una solicitud de ayuda. En ambos casos el problema se debió a conflictos de versiones y en ambos casos la solución pudo darse rápidamente de haberse trabajado desde un inicio con un entorno virtual (simplemente actualizando el entorno o recreándolo). En esta ocasión, la presencia de dependencias adicionales con las bibliotecas ya instaladas dificultó el actualizar y luego poder usar las bibliotecas o intérprete actualizados.

Es un hecho que muchas personas ven a los administradores de entornos virtuales como una complejidad que prefieren evitar y optan por trabajar con una instalación a nivel de sistema o usuario. El aprendizaje por «the hard way» viene cuando se presentan este tipo de problemas, en los que existen conflictos de versiones con librerías y un update sólo incrementa las dificultades, destapa otras, o no es posible hacerlo por permisos o conflictos con el sistema operativo.

De los dos problemas por los que se requirió ayuda, uno pudo resolverse ajustando la variable PATH y eliminando algunos enlaces simbólicos pero la solución no deja de verse como un workaround que puede dejar otros problemas latentes obligando a que tarde o temprano deba efectuarse la recomendación de «desinstala y vuelve a instalar» (sin garantía de solución mientras no se tenga certeza de que se elimina todo antes de volver a instalar). Esto en Windows con Python 3.11.

El otro problema se presentó en macOS «Monterey» con Python 3.12 a nivel sistema y Python 3.13 por Homebrew. Éste no pudo ser totalmente resuelto, llevándome a tener que recomendar la desinstalación y reinstalación a nivel de sistema, optar por usar un administrador de entornos virtuales o hacer uso de Colab para poder cubrir el ejercicio solicitado. Curiosamente, se pudo reproducir el problema en Python 3.11, pero no en Python 3.12. La reproducción trajo los mismos síntomas: un problema de certificados y la biblioteca URLLib, que al ser resuelta permitió avanzar para detenerse con un problema de «demasiadas variables SQL» al crear una base de datos con SQLite3. Los intentos por actualizar la biblioteca no funcionaron. Resolverlo requiere una mayor indagación sobre el problema y el troubleshooting efectuado por otros desarrolladores.

Así que, para una futura ocasión, voy a hacer énfasis y marcar como requisito la instalación de Miniconda para garantizar que, ante el problema de una biblioteca, me sea más fácil reproducirlo y resolverlo. Claro, además de que permita al estudiante tener la certeza de que se estará trabajando en un entorno idéntico al que el profesor usó para elaborar las tareas y ejercicios.

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.