Skip to content

Commit

Permalink
deploy: 5d2fa17
Browse files Browse the repository at this point in the history
  • Loading branch information
javlintor committed Dec 3, 2023
1 parent 85a65c7 commit 7e2b763
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 47 deletions.
86 changes: 43 additions & 43 deletions _sources/notebooks/proyecto-ejemplo/project-management.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"id": "y03oR2IaqADi"
},
"source": [
"# Gestión de proyectos en Python \n",
"# Gestión de proyectos en Python\n",
"\n",
"En esta sección vamos a hacer un recopilatorio de herramientas que nos pueden ayudar a la hora de desarrollar, estandarizar y compartir un proyecto de Python. Existen una amplica gama de herramientas de este tipo, pero aquí expongo las que encuentro más útiles en mi día a día"
]
Expand All @@ -24,33 +24,33 @@
"</div>\n",
"\n",
"[Poetry](https://python-poetry.org/) es un sistema de gestión de proyectos en Python que va más allá de manejar las dependencias de un proyecto como podemos hacer con [pipenv](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/) \n",
"Algunos lenguanjes como go o rust tienen utilidades de líneas de comandos integrados que nos permiten manejar detalles sobre nuestro proyecto \n",
"Algunos lenguanjes como go o rust tienen utilidades de líneas de comandos integrados que nos permiten manejar detalles sobre nuestro proyecto\n",
"\n",
"- configuración e instalaciones \n",
"- manejo de dependencias \n",
"- compilación y ejecuciones \n",
"- configuración e instalaciones\n",
"- manejo de dependencias\n",
"- compilación y ejecuciones\n",
"\n",
"Python no tiene una utilidad nativa pero sistemas desarrollados por terceros nos pueden ayudar a realizar estas tareas de forma precisa, como es el caso de poetry. "
"Python no tiene una utilidad nativa pero sistemas desarrollados por terceros nos pueden ayudar a realizar estas tareas de forma precisa, como es el caso de poetry."
]
},
{
"cell_type": "markdown",
"source": [
"### Instalación \n",
" \n",
"No se instala como un paquete de Python, si no como una aplicación independiente. Por ejemplo, podemos ejecutar el siguiente comando \n",
"### Instalación\n",
"\n",
"No se instala como un paquete de Python, si no como una aplicación independiente. Por ejemplo, podemos ejecutar el siguiente comando\n",
"\n",
"```\n",
"curl -sSL http://install.python.python-poetry.org | python3 -\n",
"curl -sSL https://install.python-poetry.org | python3 -\n",
"```\n",
"\n",
"aunque los detalles de instalación pueden cambiar en función de cómo tengamos configurado nuestro sistema. Para verificar que hemos instalado correctamente poetry podemos ejecutar \n",
"aunque los detalles de instalación pueden cambiar en función de cómo tengamos configurado nuestro sistema. Para verificar que hemos instalado correctamente poetry podemos ejecutar\n",
"\n",
"```\n",
"poetry --version \n",
"poetry --version\n",
"```\n",
"\n",
"y obtener un output como el siguiente `Poetry (version 1.3.1)`. "
"y obtener un output como el siguiente `Poetry (version 1.3.1)`."
],
"metadata": {
"id": "dNRV-ytgAk-y"
Expand All @@ -59,20 +59,20 @@
{
"cell_type": "markdown",
"source": [
"### Creando un nuevo proyecto \n",
"### Creando un nuevo proyecto\n",
"\n",
"Para crear un proyecto con poetry (podemos pensar que vamos a desarrollar un paquete de python) utilizamos el siguiente comando \n",
"Para crear un proyecto con poetry (podemos pensar que vamos a desarrollar un paquete de python) utilizamos el siguiente comando\n",
"\n",
"```\n",
"poetry new py4d\n",
"```\n",
"\n",
"Esto debería de crear una carpeta py4d con la siguiente estructura \n",
"Esto debería de crear una carpeta py4d con la siguiente estructura\n",
"\n",
"- Un archivo README.md como descripción del paquete \n",
"- Un archivo README.md como descripción del paquete\n",
"- Otro archivo pyproject.toml de configuración, que no debemos tocar directamente\n",
"- Una carpeta de tests para incluir nuestros tests unitarios\n",
"- Otra carpeta py4d donde estarán los ficheros con las funciones y clases de nuestro paquete. \n",
"- Otra carpeta py4d donde estarán los ficheros con las funciones y clases de nuestro paquete.\n",
"\n",
"```\n",
"py4d\n",
Expand All @@ -85,13 +85,13 @@
"\n",
"```\n",
"\n",
"Por defecto, un nuevo proyecto no tiene un entorno virtual asociado por defecto, si no que Poetry utiliza en entorno virtual que crea en \n",
"Por defecto, un nuevo proyecto no tiene un entorno virtual asociado por defecto, si no que Poetry utiliza en entorno virtual que crea en\n",
"\n",
"- macOS: `~/Library/Caches/pypoetry`\n",
"- Windows: `C:\\Users\\<username>\\AppData\\Local\\pypoetry\\Cache`\n",
"- Unix: `~/.cache/pypoetry`\n",
"\n",
"Podemos configurar poetry para que los entornos virtuales se creen directamente en el directorio del proyecto, para ello es necesario ejecutar el siguiente comando \n",
"Podemos configurar poetry para que los entornos virtuales se creen directamente en el directorio del proyecto, para ello es necesario ejecutar el siguiente comando\n",
"\n",
"```\n",
"poetry config virtualenvs.in-project true\n",
Expand All @@ -109,7 +109,7 @@
"poetry add pandas==1.3.5\n",
"```\n",
"\n",
"O por ejemplo con `pandas=^1.3.5` estamos indicando que queremos una versión superior o igual a la `1.3.5` pero siempre menor que la `2.0.0`. "
"O por ejemplo con `pandas=^1.3.5` estamos indicando que queremos una versión superior o igual a la `1.3.5` pero siempre menor que la `2.0.0`."
],
"metadata": {
"id": "uwx0Gt63AoFz"
Expand All @@ -118,30 +118,30 @@
{
"cell_type": "markdown",
"source": [
"### Manejando dependencias \n",
"### Manejando dependencias\n",
"\n",
"Otra cosa muy interesante que nos proporciona poetry es la de crear [*grupos* para las dependencias](https://python-poetry.org/docs/managing-dependencies/). Por ejemplo en un proyecto puede ser deseable tener un entorno de desarrollo en el que tengamos herramientas de formateo, testing, paquetes adicionales etc y otro más minimalista para producción. Los grupos se pueden crear en el archivo de configuración `pyproject.toml`, por ejemplo \n",
"Otra cosa muy interesante que nos proporciona poetry es la de crear [*grupos* para las dependencias](https://python-poetry.org/docs/managing-dependencies/). Por ejemplo en un proyecto puede ser deseable tener un entorno de desarrollo en el que tengamos herramientas de formateo, testing, paquetes adicionales etc y otro más minimalista para producción. Los grupos se pueden crear en el archivo de configuración `pyproject.toml`, por ejemplo\n",
"\n",
"```\n",
"[tool.poetry.group.test] \n",
"[tool.poetry.group.test]\n",
"\n",
"[tool.poetry.group.test.dependencies]\n",
"pytest = \"^6.0.0\"\n",
"pytest-mock = \"*\"\n",
"```\n",
"\n",
"Si queremos que las dependencias de un grupo no se instalen por defecto, tenemos que añadir el parámetro `optional` en la configuración \n",
"Si queremos que las dependencias de un grupo no se instalen por defecto, tenemos que añadir el parámetro `optional` en la configuración\n",
"\n",
"```\n",
"[tool.poetry.group.test] \n",
"[tool.poetry.group.test]\n",
"optional = true\n",
"```\n",
"\n",
"Podemos instalar las dependencias por defecto o de un grupo concreto utilizando `poetry install` (con las opciones `--with` o `--without`, véase la documentación). Por ejemplo si quremos actualizar solo las dependencias de un grupo, podemos hacer \n",
"Podemos instalar las dependencias por defecto o de un grupo concreto utilizando `poetry install` (con las opciones `--with` o `--without`, véase la documentación). Por ejemplo si quremos actualizar solo las dependencias de un grupo, podemos hacer\n",
"\n",
"```poetry update --with test```\n",
"\n",
"Nótese que con el comando `poetry add` las dependencias se instalan automáticamente. "
"Nótese que con el comando `poetry add` las dependencias se instalan automáticamente."
],
"metadata": {
"id": "Tdcg9UY5C_UY"
Expand All @@ -154,7 +154,7 @@
"\n",
"Podemos lanzar un script con poetry simplemente escribiendo `poetry run python your_script.py`. Del mismo modo si utilizas herramientas desde línea de comandos puedes lanzarlas con poetry, como `poetry run black .`\n",
"\n",
"Finalmente, existen funcionalidades más allá como la de construir paquetes distribuible y publicar que se basan en los comandos, `poetry build` y `poetry publish`, pero eso lo dejamos para otro día. "
"Finalmente, existen funcionalidades más allá como la de construir paquetes distribuible y publicar que se basan en los comandos, `poetry build` y `poetry publish`, pero eso lo dejamos para otro día."
],
"metadata": {
"id": "BAU289AOBNlp"
Expand All @@ -170,48 +170,48 @@
"\n",
"### flake8\n",
"\n",
"[flake8](https://github.com/pycqa/flake8) es un linter, es decir, una herramienta que nos dará información sobre qué partes de nuestro código no siguen determinadas guías de estilo o tienen alguna lógica herrónea, como asignar variables que no se utilizan o hacer los imports en el orden inadecuado. \n",
"[flake8](https://github.com/pycqa/flake8) es un linter, es decir, una herramienta que nos dará información sobre qué partes de nuestro código no siguen determinadas guías de estilo o tienen alguna lógica herrónea, como asignar variables que no se utilizan o hacer los imports en el orden inadecuado.\n",
"\n",
"flake8 nos informará a través de una serie de códigos basado en `pycodestyle` sobre qué debemos mejorar de nuestro código. En lugar de hacer los cambios a mano, puede ser interesante utilizar un formateador como black, que lo hará de forma automática y precisa por nosotros. \n",
"flake8 nos informará a través de una serie de códigos basado en `pycodestyle` sobre qué debemos mejorar de nuestro código. En lugar de hacer los cambios a mano, puede ser interesante utilizar un formateador como black, que lo hará de forma automática y precisa por nosotros.\n",
"\n",
"### Black \n",
"### Black\n",
"\n",
"<div style=\"display: flex; align-items: center; justify-content: center;\">\n",
" <img src=\"https://drive.google.com/uc?id=1xe6unReOz8Av38lNMllJKytQQidKdPJq\"/>\n",
"</div>\n",
"\n",
"\n",
"[Black](https://github.com/psf/black) es una herramienta de **formateo** de código, es decir, al aplicar black a nuestro código, va a modificar nuestro código según para que siga ciertas guías de estilo, normalmente basadas en [PEP8](https://peps.python.org/pep-0008/), que son configurables por nosotros mismos, de modo que se cambiará el estilo del código pero nunca se modificará el output del intérprete de Python. \n",
"[Black](https://github.com/psf/black) es una herramienta de **formateo** de código, es decir, al aplicar black a nuestro código, va a modificar nuestro código según para que siga ciertas guías de estilo, normalmente basadas en [PEP8](https://peps.python.org/pep-0008/), que son configurables por nosotros mismos, de modo que se cambiará el estilo del código pero nunca se modificará el output del intérprete de Python.\n",
"\n",
"[Black](https://black.readthedocs.io/en/stable/) tiene un principio básico y es que todo el código que formatea debe ser similar, haciendo que estilo pueda cambiar bastante del de partida, pero minimizando los cambios respecto a las diferentes versiones del proyecto u otros proyectos igualmente formateados. \n",
"[Black](https://black.readthedocs.io/en/stable/) tiene un principio básico y es que todo el código que formatea debe ser similar, haciendo que estilo pueda cambiar bastante del de partida, pero minimizando los cambios respecto a las diferentes versiones del proyecto u otros proyectos igualmente formateados.\n",
"\n",
"Podemos instalar black utilizando `pip`, siempre que tengamos Python 3.7 o superior. \n",
"Podemos instalar black utilizando `pip`, siempre que tengamos Python 3.7 o superior.\n",
"\n",
"```\n",
"pip install black\n",
"```\n",
"\n",
"Si queremos formatear nuestros notebooks de jupyter, debemos instalarlo con \n",
"Si queremos formatear nuestros notebooks de jupyter, debemos instalarlo con\n",
"\n",
"```\n",
"pip install black[jupyter]\n",
"```\n",
"\n",
"Se emplea de forma muy sencilla, simplemente llamando al comando `black` en una terminal \n",
"Se emplea de forma muy sencilla, simplemente llamando al comando `black` en una terminal\n",
"\n",
"```\n",
"black {fichero_que_queremos_formatear.py}\n",
"```\n",
"\n",
"Tanto flake8 como black son ejemplos de linters y formatter pero hay muchos más, cada uno con sus ventajas e inconvenientes. Son altamente configurables (por ejemplo, para alterar algunas de las normas de estilo) y suelen ser muy útiles combinadas con git, la herramienta de control de versiones de la que ya hemos hablado en el curso. En particular, podemos usar herramientas como `pre-commit` para que estas herramientas se ejecuten cada vez que realizamos un commit o similar. "
"Tanto flake8 como black son ejemplos de linters y formatter pero hay muchos más, cada uno con sus ventajas e inconvenientes. Son altamente configurables (por ejemplo, para alterar algunas de las normas de estilo) y suelen ser muy útiles combinadas con git, la herramienta de control de versiones de la que ya hemos hablado en el curso. En particular, podemos usar herramientas como `pre-commit` para que estas herramientas se ejecuten cada vez que realizamos un commit o similar."
]
},
{
"cell_type": "markdown",
"source": [
"## Logs\n",
"\n",
"El **logging** es un mecanismo para registrar información sobre la ejecución de un programa, lo que puede ser muy útil para depurar errores, auditar el uso del sistema, y tomar decisiones basadas en los datos de registro. El mecanismo de logging más básico es simplemente hacer `print` por stdout, pero hay herramientas más sofisticadas que nos permiten ir más allá. Existen varios módulos de logging en Python, pero el más comúnmente utilizado es el [logging](https://docs.python.org/3/library/logging.html) que viene con la biblioteca estándar. Con este módulo, puedes especificar el nivel de detalle que deseas registrar, elegir dónde escribir tus registros (por ejemplo, en un archivo o en la consola), y ajustar el formato de tus mensajes de registro. "
"El **logging** es un mecanismo para registrar información sobre la ejecución de un programa, lo que puede ser muy útil para depurar errores, auditar el uso del sistema, y tomar decisiones basadas en los datos de registro. El mecanismo de logging más básico es simplemente hacer `print` por stdout, pero hay herramientas más sofisticadas que nos permiten ir más allá. Existen varios módulos de logging en Python, pero el más comúnmente utilizado es el [logging](https://docs.python.org/3/library/logging.html) que viene con la biblioteca estándar. Con este módulo, puedes especificar el nivel de detalle que deseas registrar, elegir dónde escribir tus registros (por ejemplo, en un archivo o en la consola), y ajustar el formato de tus mensajes de registro."
],
"metadata": {
"id": "vP7oaLjRJD8w"
Expand Down Expand Up @@ -333,7 +333,7 @@
{
"cell_type": "markdown",
"source": [
"Si queremos sacar el log por un fichero en lugar de por consolta, deberemos añadir un handler del siguiente tipo "
"Si queremos sacar el log por un fichero en lugar de por consolta, deberemos añadir un handler del siguiente tipo"
],
"metadata": {
"id": "nyK83B-3LPs0"
Expand Down Expand Up @@ -481,7 +481,7 @@
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 2,
"execution_count": null,
"outputs": [
{
"output_type": "stream",
Expand Down Expand Up @@ -547,7 +547,7 @@
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 3,
"execution_count": null,
"outputs": [
{
"output_type": "stream",
Expand Down Expand Up @@ -581,7 +581,7 @@
{
"cell_type": "markdown",
"source": [
"Lo interesante de dash es que podemos modificar las propiedades del layout con las funciones **callback**, de modo que podemos incluir interactividad en nuestro dashboard. Por ejemplo, en esa aplicación el usuario escribe un número y Python lo multiplica por dos, mostrando el resultado también en la aplicación "
"Lo interesante de dash es que podemos modificar las propiedades del layout con las funciones **callback**, de modo que podemos incluir interactividad en nuestro dashboard. Por ejemplo, en esa aplicación el usuario escribe un número y Python lo multiplica por dos, mostrando el resultado también en la aplicación"
],
"metadata": {
"id": "tSpU6c6CFMXE"
Expand Down
Loading

0 comments on commit 7e2b763

Please sign in to comment.