Tuve la oportunidad de leer una versión inicial de “Herramientas Hypermodern Python” de Claudio Jolowicz, que se lanzará en abril de 2024. Leí la versión de junio de 2023 y me motivé a escribir una reseña porque no encontré ningún libro. sobre este tema anteriormente.
Los temas tratados en el libro anteriormente solo estaban disponibles en videos de conferencias, artículos técnicos y tutoriales, dependiendo de quién se sienta más cómodo con qué tipo de contenido. En mi opinión, si en otras fuentes se presta alguna atención a estas cuestiones, es muy superficial. Por lo general, terminan siendo varias variaciones de la instalación del propio intérprete de Python .
A junio de 2023, el libro de acceso anticipado tiene 7 secciones:
La primera sección describe el ciclo de lanzamiento del control de versiones de Python. Describe diferentes métodos de instalación para diferentes sistemas operativos: Windows, Linux , macOS, el uso de pyenv para instalar muchas versiones de intérpretes de Python, no solo los basados en CPython, sino también PyPy, IronPython, Jython, Pyston y otros. Se proporciona un ejemplo del uso de pylauncher, también para sistemas Unix. Alternativamente, se proporciona un ejemplo de instalación utilizando Anaconda.
La segunda sección analiza cómo está organizado el entorno Python: intérprete, scripts de punto de entrada, módulos (incluida la biblioteca estándar y módulos de terceros) y bibliotecas compartidas (que contienen código personalizado compilado a partir de lenguajes de bajo nivel como C). Se menciona el uso de entornos virtuales, que se pueden crear utilizando el módulo venv integrado introducido en Python3, así como las diferencias a la hora de habilitarlos para diferentes sistemas operativos. Se presenta el administrador de paquetes, tanto el pip integrado como el pipx de terceros. Se proporciona información general sobre cómo buscar módulos.
La tercera sección presenta el índice del paquete Python. Damos un ejemplo de un script simple y mostramos todo el flujo de trabajo, desde la creación de un proyecto hasta su carga en los índices del paquete real y de prueba. El archivo pyproject.toml se utiliza para especificar metainformación al crear un paquete de aplicación. Como backend de compilación se utiliza un Hatch de administrador de proyectos moderno y compatible con los estándares (https://hatch.pypa.io/latest/). La herramienta de carga oficial de PyPI: Twine se utiliza como herramienta de carga de paquetes. Se enumeran las opciones de paquete: sdists y ruedas. Se proporciona una lista de los campos más esenciales con metainformación en el archivo pyproject.toml para un proyecto.
La cuarta sección plantea probablemente el problema más ambiguo: el problema de la gestión de la dependencia en un proyecto. Hay dos opciones: requisitos.txt con posibles variaciones y combinaciones, y pyproject.toml. Sorprendentemente, aquí no habrá una historia sobre poesía, pero su descripción no tardará en la quinta sección. Fue bastante interesante conocer la existencia de una herramienta para generar el llamado locus de dependencia utilizando la herramienta pip-tools.
La quinta sección trata sobre la conocida poesía, que proporciona una herramienta automatizada para tareas rutinarias: gestión de dependencias, creación de un paquete y publicación en el índice de paquetes, etc. Se describen las diferencias con pyproject. Describimos las diferencias en pyproject.toml de lo que se describió en los capítulos anteriores cuando nos familiarizamos con su sintaxis. Existen alternativas a la poesía en el ecosistema Python, como hatch y maturin.
La sección seis describe un breve kmb (curso para jóvenes luchadores) sobre pruebas con elementos de refactorización para desarrolladores de Python, y menciona dos marcos de prueba: unittest y pytest. Estos son los conceptos básicos, pero también se proporcionan otras fuentes con descripciones más detalladas del tema para profundizar. Lo único que no se menciona es la nariz, pero en la práctica, pytest ha sido el líder de facto en los últimos años. En el caso de restricciones de dependencia, la elección es obvia: prueba unitaria. Se proporciona un ejemplo de código de minirefactorización para crear una base más flexible para el soporte de código futuro y simplificar las pruebas.
En la séptima sección , analizamos la cuestión de la cobertura de prueba utilizando el módulo de seguimiento estándar y el módulo de cobertura de terceros. Pero aún así se recomienda utilizar el módulo de terceros, que se puede ejecutar en diferentes versiones del intérprete de Python, y luego obtener un informe combinado sobre la cobertura del código siguiendo la regla ejecución de cobertura → combinación de cobertura → informe de cobertura. Al final, todo el mundo se enfrenta a un dilema en algún momento de un proyecto: “Para realizar pruebas, es necesario refactorizar el código; pero refactorizar sin pruebas es demasiado arriesgado”.
Aquí, lo más probable es que todo dependa del proyecto en sí, su alcance, la calidad del código en sí y la disponibilidad de pruebas como tales. Me parece que hay que adoptar un camino pragmático, y no siempre se debe lograr una referencia del 100%, muchas veces no es necesario. Lo más probable es que, al momento de leer esto, el capítulo sobre la automatización de toda la historia usando la herramienta Nox aún no estuviera listo.
Antes de resumir, instalemos pipx e intentemos usarlo.
En el sitio web oficial, los desarrolladores de la herramienta la posicionan así:
“Resumen: ¿Qué es pipx?
pipx es una herramienta que le ayuda a instalar y ejecutar aplicaciones de usuario final escritas en Python. Es más o menos similar a Brew de macOS, npx de JavaScript y apt de Linux.
Está estrechamente relacionado con pip. De hecho, utiliza pip, pero se centra en instalar y administrar paquetes de Python que se pueden ejecutar desde la línea de comandos directamente como aplicaciones”.
Es una gran noticia si el paquete también viene con una interfaz CLI , ya que será posible ejecutar el paquete deseado directamente, con un solo comando, sin preinstalación. Hola a la herramienta npx del mundo NodeJS;)
Después de instalar pipx localmente, ejecutemos 5 proyectos pequeños para ver qué tan rápido y fácil es.
En la consola, ejecuta el siguiente comando: $ pipx run google-speech -l en -o hello_world.mp3 "Hello, world!"
En este caso, el archivo hello_world.mp3 se crea en el directorio donde se ejecutó el comando y se puede escuchar con un reproductor multimedia.
En la consola, ejecute el siguiente comando: $ pipx run chksum-cli ./hello_world.mp3 b754e299a96327caaddd44b453f66ed9439c5d64d0d6e55c7e32471115757e5e sha256
El resultado se mostrará independientemente de que las sumas de comprobación de los archivos coincidan o no.
En la consola, ejecute el siguiente comando: $ pipx run httpy-cli mail.ru
Se generará una respuesta HTTP con encabezados y cuerpo de solicitud.
En la consola, ejecute el siguiente comando: $ pipx run timy-cli -с
Se mostrará un reloj analógico, con la posibilidad de detenerlo mediante la combinación de teclas CTRL + C.
En la consola, ejecute el siguiente comando: $ pipx run cli-chess
Se iniciará un menú para seleccionar el tipo de juego:
Para ver opciones adicionales, puede agregar la tecla --help a los comandos anteriores.
En general, el libro es fácil de leer, pero un poco confuso en algunos lugares. Quizás le falten algunos ejemplos no triviales. El libro describe un script de muestra para recuperar un artículo aleatorio de Wikipedia.
Lo que me gustó:
Personalmente, descubrí la herramienta pipx (análoga a npx en el mundo Node.js), que es muy útil cuando necesitas familiarizarte rápidamente con algo y echarle un vistazo. Especialmente bueno para proyectos donde hay una interfaz cli para ejecutar;
Fue interesante saber que existen alternativas a la poesía (https://python-poetry.org/), como hatch (https://hatch.pypa.io/latest/) y maturin (https://www. maturin.rs/);
Ejemplo de uso de backports para diferentes versiones del intérprete de Python; por ejemplo, importlib_metadata se utiliza como backport para Python3.7, a diferencia de importlib.metadata para Python3.8. Código de muestra del libro:
try:
from importlib.metadata import metadata
except ImportError:
from importlib_metadata import metadata
Lo que creo que falta en el libro:
No se cubre la opción de utilizar un administrador de paquetes para instalar Python en la familia de sistemas operativos Windows, como chocolatey (https://chocolatey.org/);
No se cubre la forma de compilar Python desde el código fuente para distribuciones Unix;
No hay forma de ejecutar Python en un contenedor Docker. Hay muchas construcciones ahora, empezando por la más minimalista basada en alpino;
No se consideró una forma de llevar el proyecto a ejecutar un archivo ejecutable .exe en Windows (en mi práctica hubo un caso así. Sí, estoy de acuerdo en que es una tarea muy específica, pero aún así);
No hay ningún ejemplo de distribución de proyectos alternativa, por ejemplo, utilizando el administrador de paquetes estándar apto para distribuciones tipo Debian con la ayuda de setuptools y dh-virtualenv con formación de paquetes *.deb);
No hay ningún capítulo que describa linters como pylint, flake8, isort, black, mypy, pyright, etc.
Pero esta es mi opinión subjetiva, es posible que no estés de acuerdo.
A pesar de que el libro aún no está en su versión final (su lanzamiento está previsto para abril de 2024), puedo recomendarlo a cualquiera que esté interesado en Python.
Autor: Daniil Nikitin, desarrollador senior de software en Usetech