Que tal gente de CódigoFacilito, 🎉 mi nombre es Eduardo y en esta ocasión me gustaría compartir con todos ustedes 5 tips los cuales espero puedan serles de mucha ayuda al momento de trabajar con Python. 🐍
Es importante mencionar que estos no son tips de "hacks" con el lenguaje, no vamos a ver ejemplos como el siguiente:
>>> a = [ (0, 'Curso'), (1, 'CódigoFacilito') ]
>>> for {}[()], x in a:
>>> print(x)
Curso
CódigoFacilito
En donde en un ciclo for podemos reemplazar el guión bajo por algo un poco menos convencional, no, nada de eso. Estos tips están pensados más a la productividad y a nuestro proyectos, sin embargo si te gustaría un vídeo de "hacks con Python" o un vídeo de "Cómo escribir código más pythonista" dejanoslo saber en la sección de comentarios. 😎
Bien, sin más dilación comencemos.
Utilizar entornos virtuales
Una muy buena idea al momento de comenzar cualquier proyecto en Python es utilizar un entorno virtual. Cómo sabemos habrá ocasiones en las cuales tengamos la necesidad de hacer uso de algún módulo, librería o Framework que no se encuentre en la biblioteca estándar de Python. En esos casos, para evitar conflictos entre versiones y que nuestros proyectos estén completamente aislados unos de otros, un entorno virtual es sin duda la solución.
Con las nuevas versiones de Python no hay excusas, crear un entorno virtual es extremadamente sencillo, basta con ejecutar el siguiente comando. 😎
python -m venv <nombre de nuestro entorno>
Y de esta forma tendremos nuestro propio entorno virtual listo para ser utilizado.
De forma personal, en la mayoría de los casos, yo no coloco el entorno dentro del proyecto per se, esto por el siemple hecho que no es una muy buena idea subir las dependencias al repositorio, creo que es mejor colocar el entorno al mismo nivel que el proyecto.
Implementar el archivo requirements.txt
Este es un punto que sí o sí tendremos que utilizar en algún punto de nuestra carrera, más aún si estamos pensado en trabajar en algún proyecto de forma colaborativa.
Por si no lo sabías, por convención todos los desarrolladores Python debemos colocar las dependencias de nuestros proyectos, junto con sus correspondientes versiones, en un archivo llamado requirements.txt. Este archivo deberá ser incluido en el repositorio del proyecto con la finalidad que al momento de desplegar la aplicación en cualquier computadora la instalación de las dependencias sea los más sencilla posible.
Para crear el archivo basta con ejecutar.
pip freeze > requirements.txt
Y para instalar las dependencias a partir del archivo.
pip install -r requirements.txt
Cada vez que agreguemos o removamos alguna dependencia del proyecto, por mínima que sea, estaremos obligados a sobreescribir el archivo, ya que es nuestra obligación como desarrolladores mantener el archivo actualizado.
Si queremos desplegar nuestra aplicación a producción el archivo requirements.txt será indispensable.
Docstring
Si bien es cierto que dar nuestro primeros pasos con las pruebas unitarias puede llegar hacer, en la mayoría de los casos, tedioso (Lo digo yo 👻) la mejor forma más sencilla de comenzar con Python es sin duda utilizando el Docstring y el Doctest.
Basta con que en la documentación de nuestras funciones y/o métodos coloquemos un par de casos de prueba, casos con los cuales queramos testear la funcionalidad.
Veamos un ejemplo.
def palindromo(mensaje):
"""
Parameters:
- mensaje (str)
>>> palindromo('Anita lava la tina')
True
>>> palindromo('Hola CódigoFacilito')
False
"""
mensaje = mensaje.lower().replace(' ', '')
return mensaje == mensaje[::-1]
Una vez hayamos definido un par de pruebas, en este caso el llamado a la función con dos diferentes argumentos, ejecutamos el siguiente comando.
python -m doctest archivo.py
Si no obtenemos ningún error podemos dar por hecho que todos los casos se ejecutaron de forma correcta.
Esta práctica sin duda nos dará el hábito de comenzar a utilizar pruebas para testear cada uno de nuestros proyectos.
Anotaciones
En versiones actuales de Python se implementaron los annotations, que, en términos simple no son más que expresiones las cuales sirven para representar ciertas partes del código.
Veamos un pequeño ejemplo.
from typing import List
Vector = List[float]
def scale(scalar: float, vector: Vector) -> Vector:
return [scalar * num for num in vector]
new_vector = scale(2.0, [1.0, -4.2, 5.4])
Tal cual, un lenguaje de tipado fuerte, con python podemos dar mayor claridad a los desarrolladores de los tipos de datos con los que se trabajarán, en este caso indicó el tipo de los parámetros y el valor de retorno.
Desde mi punto de vista creo que las anotaciones que es un excelente feature el cual en muchas ocasiones no estamos aprovechando. Es cierto que el código de python es muy fácil de leer, y más aún si seguimos las convenciones de pep8, sin embargo creo que no estaría de más utilizar las anotaciones para evitar cualquier tipo de ambigüedad por parte de los programadores, más aun si queremos liberar nuestro proyecto a la comunidad.
Módulo Login
La forma más sencilla de testear nuestras aplicaciones es sin duda utilizando la función print, no me dejarán mentir y sin duda más de uno hemos utilizado esta técnica para debuguear si nuestra aplicación. Yo lo he hecho, colocó mensajes como: Entramos a la función x, se ejecutó y algoritmo, retornamos z etc ... Esto funciona, sin embargo, si queremos escribir código de calidad y de forma profesional lo que debemos hacer es optar por utilizar el módulo logging.
Lo interesante del módulo logging es que nos permite trabajar con 5 tipos de mensajes.
- Debug
- Info
- Warning
- Error
- Critial
Cada un de ellos con un nivel bien definido, con lo cual seremos capaces de configurar que tipo de mensaje podrás o no ver el usuario, además por si fuera poco los mensajes pueden enviarse en al standard output o al estándar error, dependiendo cual sea el caso.
import logging
# Debug (10), Info (20), Warning (30), Error (40), Critical (50)
#logging
logging.basicConfig(
level=logging.DEBUG,#10
format='%(message)s - %(processName)s',
#datefmt='%H:%M:%S',
#filename='messages.txt'
)
logging.debug('Este es un mensaje de tipo Debug')
logging.info('Este es un mensaje de tipo Info')
logging.warning('Este es un mensaje de tipo Warning')
logging.error('Este es un mensaje de tipo Error')
logging.critical('Este es un mensaje de tipo Critical')
Otra de las ventajas de utilizar logging es que si así lo deseamos podemos configurar los mensajes para conocer qué thread y/o proceso se está ejecutando, algo que con la función print no podremos.
Por esto y mucho más, si queremos desarrollar programas profesionales con Python, el módulo logging es indispensable.
Conclusión
Bien, estos serían algunos tips los cuales consideró te será de mucha ayuda al estar desarrollando cualquier proyecto en Python. Si bien creo que 5 tips son poco, quizás tengamos otra segunda entrega con otros 5 tips en complemento a este vídeo.
Y cuentame, que otro tip de desarrollo Python te gustaría compartir con la comunidad, no olvides colocarlo en la sección de comentarios. Sin más, yo me despido, muchas gracias por tu valioso tiempo. 🐍🍻