Después de más de 3 años programando todos los días en Typescript he tenido la oportunidad de cambiar mi lenguaje de trabajo principal y empezar a usar Python. Hoy tratare de explicar cómo ha sido esta transición, sus pros y sus contras, a través de una serie de puntos claves.
Testing
Todas las veces que en mi vida profesional he tenido que aprender un nuevo lenguaje siempre he seguido el mismo camino, un camino que siempre empieza con la misma pregunta: "¿Cómo se hace testing aquí?".
Por suerte para mi tengo que decir que en lo que respecta al testing Python es un gran lenguaje, es posible hacer TDD desde el minuto 0 sin falta de tener que instalar ninguna dependencia (de esto hablaré luego) lo que es un gran punto positivo.
La libreria tiene integradas un par de opciones, Pytest y Unittest, que son más que suficientes para poder empezar a explorar el lenguaje a través de los tests.
Si quisiéramos ir un paso más allá y mejorar la experiencia os detallo algunas librerías muy interesantes:
- Expects: Conjunto de matchers super utiles.
- Doublex: Librería para el uso de Mocks, Spies and Stubs.
- Doublex Expects: Conjunto de matchers para Doublex.
- Mamba: Una runner para hacer tests usando BBD.
Por tanto puedo afirmar que esta primera aproximación a Python fue super positiva, esto promete!.
Lenguaje
Si por algo se conoce a Python es por ser un lenguaje muy divertido, donde prácticamente todo está permitido y claro, esto viniendo de usar Typescript…se hace un poco raro (por no decir mucho jajaja).
Durante los primeros días de exploración me encontré con una serie de puntos que paso a enumerar y que me han parecido los más importantes:
- No existe el concepto interfaz, en Python las interfaces son clases abstractas que te obligan a heredarlas e implementar los métodos.
- Existe la herencia múltiple.
- No existen los Enums como tal, se debe crear una clase que hereda de otra llamada Enum dentro del módulo enums y con ello se puede llegar más o menos al mismo resultado.
- Los diccionarios no tiene orden cuando se comparan, lo que facilita enormemente su comparación.
- Las tuplas son inmutables, si necesitas mutarlas debes hacer cast a lista y cast de vuelta a tupla.
- Una tupla de un único elemento, (1), se transforma en el propio valor ((1) == 1) y deja de ser una tupla. Si necesitas una tupla debes añadir una coma dentro de la misma, (1,) .
- Existen los valores por defecto en los parámetros de un método.
- Es posible añadir métodos y propiedades a instancias una vez creadas (muy JS esto).
- Me han resultado super utiles las List Comprehension.
- Existe el concepto lambda, que vendría a ser el equivalente a las arrow function de JS/TS.
- Para crear métodos estáticos es necesario usar el decorador @staticmethod en un método dentro de una clase.
- No es posible hacer un método o un propiedad privada, esto es algo que a dia de hoy sigo sin entender pero es algo bien conocido y asumido por todo el mundo. Lo que propone el lenguaje es prefijar estos métodos-propiedades con _ y confiar en el buen uso por otros desarrolladores.
- No existe el concepto de constantes, nuevamente se asume que una variable en mayúsculas es una constante, pero nada te evita poder modificarla.
- El lenguaje tiene out of the box una serie de funciones para trabajar con listas que siempre eché de menos en el ecosistema JS, hablo de zip, max, min, cmp, enumerate,…(este me parece un gran punto a favor de Python).
- A partir de la versión 3.5 Python tiene la opción de trabajar con tipos haciendo uso de MyPy, lo que para mi fue un grandísima noticia. Después de tanto tiempo no contemplo trabajar con un lenguaje sin una red de seguridad como es tener todo tipado.
- Me ha gustado mucho el concepto de Context Manager.
Dependencias
Antes de empezar a trabajar con Python de forma profesional tenia la sensación de que esto iba ser un lío, acostumbrado a instalar dependencias con pip y almacenándose en el mítico requirements.txt me temía lo peor. Pero nada más lejos de la realidad, existe un gestor de dependencias llamada Poetry que soluciona todos estos problemas.
Me recordó mucho a *npm en cuanto a que todas las dependencias están definidas en un único fichero, existe un fichero poetry.lock y existe una inmensa variedad de librerías disponibles.
Herramientas
Respecto al tooling tengo que decir que estoy bastante impresionado, tanto a nivel IDE (Pycharm es una maravilla y el refactor automático funciona increible), como a los editores de texto (personalmente trato de usar Vim lo máximo posible y Python es un lenguaje que se integra de maravilla, no puedo decir lo mismo de TS).
Un punto muy importante y que por suerte en el entorno JS/TS ya no es algo de lo que tengas que preocuparte gracias a Prettier, es la parte del formateo y consistencia del código. Por suerte en Python existe Black que hace este trabajo de forma excepcional.
Si necesitas dockerizar un app en Python el proceso es super sencillo y no hay ningún tipo de problema, existen múltiples imágenes (tanto normales como slim) con casi todas las versiones existentes.
Recursos disponibles
Mi punto de referencia cuando quiero practicar con un lenguaje siempre es Exercism y tengo que decir que el track de Python es de los mejores que he visto en la plataforma. Esta super bien estructurado y los mentores son increíbles. Si no lo conoces te lo recomiendo al 200%.
Gracias a una charla de @nyan_dev descubri lo que se conoce como koans muy popular dentro del ecosistema Ruby pero que por suerte para mi también existe su equivalente en Python aqui estan disponibles mis soluciones.
Si eres de los que les gusta aprender resolviendo pequeños ejercicios Daily Coding Problem te va a interesar. Cada día recibirás un problema, sacado de entrevistas en procesos de selección, donde podrás poner a prueba tus conocimientos.
Por último, me gustaría recomendar 30 seconds of Python, una web muy interesante para profundizar un poco más en el lenguaje y subir un un escalón más en nuestro nivel.
Conclusiones
Y creo que no me dejo nada!
En términos generales estoy disfrutando mucho este cambio de lenguaje (creo que esta fase es común y no depende tanto del lenguaje en si xD), aunque es verdad que hay cosas que no acabo de entender en un lenguaje en pleno 2022 (sobre todo lo referente a privacidad y constantes).
Python es un lenguaje “pegamento” que se integra muy bien con otros ecosistemas (en mi caso principalmente Slack, AWS, Airtable y K8S) por lo que es bastante fácil poder hacer cosas chulas en poco tiempo y sin tener que hacer mucha preparación.
Además el testing para mi es espectacular, es posible correr una suite de unos 600 tests (70% unitarios, 20% integración y 10% e2e) en cuestiones de minutos, lo que me parece un tiempo bastante bajo.
Espero que te haya servido de algo y si es asi compartelo porfa :-)!