diff --git a/recursos/apendices/pip/requirements.txt b/recursos/apendices/pip/requirements.txt new file mode 100644 index 0000000..88e8263 --- /dev/null +++ b/recursos/apendices/pip/requirements.txt @@ -0,0 +1,22 @@ +arrow==1.3.0 +binaryornot==0.4.4 +certifi==2025.1.31 +chardet==5.2.0 +charset-normalizer==3.4.1 +click==8.1.8 +cookiecutter==2.6.0 +idna==3.10 +Jinja2==3.1.6 +markdown-it-py==3.0.0 +MarkupSafe==3.0.2 +mdurl==0.1.2 +Pygments==2.19.1 +python-dateutil==2.9.0.post0 +python-slugify==8.0.4 +PyYAML==6.0.2 +requests==2.32.3 +rich==13.9.4 +six==1.17.0 +text-unidecode==1.3 +types-python-dateutil==2.9.0.20241206 +urllib3==2.3.0 diff --git a/recursos/leccion6/funcion_ipdb.py b/recursos/leccion6/funcion_ipdb.py new file mode 100644 index 0000000..46850e5 --- /dev/null +++ b/recursos/leccion6/funcion_ipdb.py @@ -0,0 +1,13 @@ +import ipdb + + +def calculo(cedula, *args): + ipdb.set_trace() + if args[0]: + print(args[0]) + elif args[1]: + print(args[1]) + print(cedula) + + +calculo(14522590, 12, 2334) diff --git a/recursos/leccion8/mi_paquete.zip b/recursos/leccion8/mi_paquete.zip new file mode 100644 index 0000000..c1d9ea5 Binary files /dev/null and b/recursos/leccion8/mi_paquete.zip differ diff --git a/recursos/leccion8/mi_sitio.zip b/recursos/leccion8/mi_sitio.zip new file mode 100644 index 0000000..625f2eb Binary files /dev/null and b/recursos/leccion8/mi_sitio.zip differ diff --git a/recursos/leccion8/modulos/calculadora/calculo_resta.py b/recursos/leccion8/modulos/calculadora/calculo_resta.py new file mode 100644 index 0000000..00a4a72 --- /dev/null +++ b/recursos/leccion8/modulos/calculadora/calculo_resta.py @@ -0,0 +1,6 @@ +"""Módulo para realizar operaciones de resta.""" + +from operaciones import resta + +resultado_resta = resta(10, 5) +print(f"La resta es: {resultado_resta}") diff --git a/recursos/leccion8/modulos/calculadora/calculo_suma.py b/recursos/leccion8/modulos/calculadora/calculo_suma.py new file mode 100644 index 0000000..cf1acec --- /dev/null +++ b/recursos/leccion8/modulos/calculadora/calculo_suma.py @@ -0,0 +1,6 @@ +"""Módulo para realizar operaciones de suma.""" + +from operaciones import suma + +resultado_suma = suma(10, 5) +print(f"La suma es: {resultado_suma}") diff --git a/recursos/leccion8/modulos/calculadora/calculos_matematicos.py b/recursos/leccion8/modulos/calculadora/calculos_matematicos.py new file mode 100644 index 0000000..fbdd7a7 --- /dev/null +++ b/recursos/leccion8/modulos/calculadora/calculos_matematicos.py @@ -0,0 +1,19 @@ +"""Este módulo contiene funciones para realizar cálculos matemáticos básicos.""" + + +def suma(a, b): + """ + Esta función suma dos números y devuelve el resultado. + """ + return a + b + + +def resta(a, b): + """ + Esta función resta dos números y devuelve el resultado. + """ + return a - b + + +print(f"La suma es: {suma(10, 5)}") +print(f"La resta es: {resta(10, 5)}") diff --git a/recursos/leccion8/modulos/calculadora/operaciones.py b/recursos/leccion8/modulos/calculadora/operaciones.py new file mode 100644 index 0000000..d61e193 --- /dev/null +++ b/recursos/leccion8/modulos/calculadora/operaciones.py @@ -0,0 +1,17 @@ +"""Este módulo contiene funciones para realizar cálculos matemáticos básicos.""" + + +def suma(a, b): + """ + Esta función suma dos números y devuelve el resultado. + """ + resultado = a + b + return resultado + + +def resta(a, b): + """ + Esta función resta dos números y devuelve el resultado. + """ + resultado = a - b + return resultado diff --git a/recursos/leccion8/modulos/calculo_factura_pipo.py b/recursos/leccion8/modulos/pipo/calculo_factura_pipo.py similarity index 100% rename from recursos/leccion8/modulos/calculo_factura_pipo.py rename to recursos/leccion8/modulos/pipo/calculo_factura_pipo.py diff --git a/recursos/leccion8/modulos/utilidades.py b/recursos/leccion8/modulos/pipo/utilidades.py similarity index 100% rename from recursos/leccion8/modulos/utilidades.py rename to recursos/leccion8/modulos/pipo/utilidades.py diff --git a/source/apendices/entornos_virtuales.rst b/source/apendices/entornos_virtuales.rst new file mode 100644 index 0000000..b0422a7 --- /dev/null +++ b/source/apendices/entornos_virtuales.rst @@ -0,0 +1,177 @@ +.. _python_entornos_virtuales: + +Entornos virtuales Python +========================= + +`virtualenv`_ es una herramienta de Python que permite crear entornos virtuales +aislados para proyectos Python. Esto es útil para gestionar dependencias y evitar +conflictos entre diferentes proyectos. + +Instalación +----------- + +Para instalar este paquete ``virtualenv`` use la herramienta :ref:`pip ` +ejecutando el siguiente comando, el cual a continuación se presentan el correspondiente +comando de tu sistema operativo: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + sudo apt install -y python3-virtualenv + + .. group-tab:: Windows + + .. code-block:: console + + pip3 install virtualenv + +Para verificar que el comando :command:`virtualenv` se ha instalado correctamente, escriba: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + virtualenv --version + + .. group-tab:: Windows + + .. code-block:: console + + virtualenv --version + + +Si muestra la versión del módulo ``virtualenv``, tiene correctamente instalado el módulo. + + +Crear entorno virtual +--------------------- + +Cree un directorio raíz para almacenar los diversos entornos virtuales, ejecutando +el siguiente comando: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + mkdir ~/virtualenv && cd $_ + + .. group-tab:: Windows + + .. code-block:: console + + mkdir C:\virtualenv + + +Cree un entorno virtual llamado :command:`python3`, ejecutando el siguiente comando: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + virtualenv --python /usr/bin/python3 python3 + + .. group-tab:: Windows + + .. code-block:: console + + virtualenv --python C:\Python311\python.exe C:\virtualenv\python3 + + +Activar entorno virtual +----------------------- + +Activar el entorno virtual llamado :command:`python3`, ejecutando el siguiente comando: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + source ~/virtualenv/python3/bin/activate + + .. group-tab:: Windows + + .. code-block:: console + + source C:\virtualenv\python3\bin\activate + + +Desactivar entorno virtual +-------------------------- + +Para desactivar entorno virtual creado, con el siguiente comando: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + deactivate + + .. group-tab:: Windows + + .. code-block:: console + + deactivate + + +De esta forma, puedes tener un directorio común para almacenar diversos entornos virtuales. +Con herramientas como ``virtualenv`` puede gestionar diversos entornos virtuales de Python +para diversas versiones de Python, por ejemplo: + +Diversas versiones de Python, es posible que requiera trabajar con un proyecto Python que +requiera la versión ``3.9`` y y al otro proyecto que requiera la versión ``3.11``, para estés +caso puede gestionar la instalación de las dos versiones de Python con la herramienta `pyenv`_ +y luego crear dos entornos virtuales para cada version, con los siguientes comandos: + +Crear y activar un entorno virtual para la versión Python ``3.9``, ejecutando el siguiente comando: + +.. code-block:: console + + virtualenv --python ~/.pyenv/shims/python3.9 ~/virtualenv/python39 && source ~/virtualenv/python39/bin/activate + + +Crear y activar un entorno virtual para la versión Python ``3.11``, ejecutando el siguiente comando: + +.. code-block:: console + + virtualenv --python ~/.pyenv/shims/python3.11 ~/virtualenv/python311 && source ~/virtualenv/python311/bin/activate + + +En estos casos anteriores, hemos creado dos entornos virtuales como ``python39`` y ``python311``, +esto le permite crear diversos entornos virtuales para proyectos, con el nombre que quiera, +podría ser un entorno virtual para llamado ``acme_inc`` para un cliente llamado **ACME Industry** +o otro entorno virtual llamado ``test-django`` para unas pruebas de un proyecto de Django. + +.. tip:: + + Normalmente es muy común conseguir en las instrucciones de instalación de entornos virtuales + para diversos proyectos Python, con los siguientes nombres ``.env``, ``.venv`` y ``venv``. + + +Con esto, ya tiene todo listo para continuar. + + +---- + + +.. raw:: html + :file: ../_templates/partials/soporte_profesional.html + + +.. + .. disqus:: + +.. _`virtualenv`: https://pypi.org/project/virtualenv/ +.. _`pyenv`: https://github.com/pyenv/pyenv diff --git a/source/apendices/pip.rst b/source/apendices/pip.rst new file mode 100644 index 0000000..335f9f8 --- /dev/null +++ b/source/apendices/pip.rst @@ -0,0 +1,269 @@ +.. _python_pip: + + +Python package installer - pip +============================== + +`pip`_, es el instalador de paquetes de Python. Se integra con la herramienta +:ref:`virtualenv `, no hace instalaciones parciales, +puede guardar el estado del paquete para reproducirlo, puede instalar desde fuentes +que no sean :term:`Egg`, y puede instalar desde repositorios de control de versiones. + +Instalación +----------- + +Instalar la herramienta :ref:`pip `, ejecute el siguiente comando: + +.. code-block:: console + + sudo apt install -y python3-pip + +Para instalar este paquete ``pip`` ejecute el siguiente comando, el cual a continuación +se presentan el correspondiente comando de tu sistema operativo: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + sudo apt install -y python3-pip + + .. group-tab:: Windows + + En primer lugar, asegúrese de que Python está instalado en su sistema. Abra el símbolo + del sistema y escriba el siguiente comando: + + .. code-block:: console + + python --version + + Si Python está instalado, mostrará el número de versión. + + Descargue el script :file:`get-pip.py` de la pagina web oficial, con el siguiente comando: + + .. code-block:: console + + curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py + + Ejecute el script descargado utilizando Python, con el siguiente comando: + + .. code-block:: console + + python get-pip.py + + Para verificar que el comando :command:`pip` se ha instalado correctamente, escriba el + siguiente comando: + + .. code-block:: console + + pip --version + + Si muestra la versión del comando :command:`pip`, tiene correctamente instalado el módulo. + + Si se encuentra con un error "pip no reconocido", añada el comando :command:`pip` a su variable de entorno ``PATH``: + + #. Localice el directorio de instalación del comando :command:`pip` (por ejemplo, :file:`C:\\Python311\\Scripts`). + + #. Vaya a *Panel de control* > *Sistema y seguridad* > *Sistema* > *Configuración avanzada del sistema*. + + #. Haga clic en *Variables de entorno*, busque la variable ``PATH`` y añada el directorio donde está instalado el comando :command:`pip`. + +Para comprobar que la instalación de la herramienta :ref:`pip ` este correctamente hecha, +ejecute el siguiente comando: + +.. code-block:: console + + pip3 -V + +Si ejecuto el comando anterior, este da como resultado lo siguiente: + +.. code-block:: console + + pip 25.0.1 from /usr/bin/lib/python3.11/site-packages/pip (python 3.11) + +Si muestra el numero de la versión instalada de :ref:`pip `, tiene correctamente instalada +la paquete. + +Con esto, ya tiene todo listo para continuar. + +---- + + +.. _python_pip_cache: + + +Cache local de paquetes +----------------------- + +Crear directorio cache para paquetes Python descargados. Cuando hay latencia de +Internet y se requiere la instalación de paquetes de Python por un archivo +``requirements.txt`` de la herramienta :ref:`pip ` +pero la instalación falló, entonces puede evitar que la herramienta :ref:`pip ` vuelva +a descargar los paquetes previamente descargados, ejecutando este comando: + +Cree un directorio cache para los paquetes descargando con la herramienta :ref:`pip `, +ejecutando el siguiente comando: + +.. code-block:: console + + mkdir -p ~/.cache/pip && mkdir ~/.pip + + +Cree el archivo de configuración de la herramienta :ref:`pip `, +ejecutando el siguiente comando: + +.. code-block:: console + + printf '[global]\ndownload_cache = ~/.cache/pip\n' >> ~/.pip/pip.conf + +Así cada ves que ejecute el comando :command:`pip3 install` de la herramienta :ref:`pip ` +usara el directorio :file:`~/.cache/pip` como directorio cache, esto permite agilizar la descarga +de paquetes, ya que :ref:`pip ` primero buscara en ese archivo +primero, si no esta descargado, lo buscara en Internet en el repositorio :term:`PyPI`. Con esto, +ya tiene todo listo para continuar. + + +---- + + +.. _python_pip_requirements: + + +Gestionar paquetes Python +------------------------- + +Para gestionar paquetes Python dentro de un entorno virtual creado, con el siguiente comando: + +.. code-block:: console + + pip3 install cookiecutter + +El paquete `cookiecutter `_ se instalo +previamente puede usarlo vía script de línea de comando, con el siguiente: + +.. code-block:: console + + cookiecutter --help + +Ademas si requiere instalar paquetes Python con latencia de conexión a Internet. Cuando hay +latencia de Internet y se requiere la instalación de paquetes de Python, ejecute este +comando con el parámetro ``--timeout`` habilitado para el tiempo de espera: + +.. code-block:: console + + virtualenv --python /usr/bin/python3 venv + +.. code-block:: console + + source ./venv/bin/activate + +.. code-block:: console + + pip3 install -U pip && pip3 install cookiecutter --timeout 120 + +También puede gestionar una lista de instalación de paquetes y sus versiones para indicar +a la herramienta :ref:`pip ` que los instale con un solo comando, para esto cree y edite un +archivo, ejecutando lo siguiente: + +.. code-block:: console + + nano requirements.txt + +Agregue el siguiente contenido: + +.. code-block:: console + + cookiecutter==2.6.0 + +Guarde el archivo y procede a ejecutar la herramienta :ref:`pip `, con el parámetro ``-r`` +seguido de la ruta absoluta o relativa del archivo previamente creado. + +.. code-block:: console + + pip3 install -r requirements.txt + +Luego de la instalación puede ejecuta el comando :command:`cookiecutter -V` el cual ofrece +una salida de la versión. + +.. code-block:: console + + cookiecutter -V + +Luego de la instalación puede ejecuta el comando :command:`pip3 freeze` el cual ofrece una salida de +paquetes instalados en formato de archivos `requirements `_. +Los paquetes se enumeran en un ordenan de forma tal que no distingue entre mayúsculas y minúsculas. + +.. code-block:: console + + pip3 freeze + +Si ejecuto el comando anterior, debería mostrar algo parecido al siguiente mensaje: + +.. code-block:: console + :class: no-copy + + arrow==1.3.0 + binaryornot==0.4.4 + certifi==2025.1.31 + chardet==5.2.0 + charset-normalizer==3.4.1 + click==8.1.8 + cookiecutter==2.6.0 + idna==3.10 + Jinja2==3.1.6 + markdown-it-py==3.0.0 + MarkupSafe==3.0.2 + mdurl==0.1.2 + Pygments==2.19.1 + python-dateutil==2.9.0.post0 + python-slugify==8.0.4 + PyYAML==6.0.2 + requests==2.32.3 + rich==13.9.4 + six==1.17.0 + text-unidecode==1.3 + types-python-dateutil==2.9.0.20241206 + urllib3==2.3.0 + +Usted puede actualizar el archivo ``requirements.txt`` con el resultado de la ejecución el comando +``pip3 freeze`` ejecutando el siguiente comando: + +.. code-block:: console + + pip3 freeze > requirements.txt + +Así de esta forma congela las versiones usadas para el proceso de instalación de sus paquetes Python. + + +Con esto, ya tiene todo listo para continuar. + + +---- + + +.. important:: + Usted puede descargar el archivo usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`requirements.txt <../../recursos/apendices/pip/requirements.txt>`. + + +.. tip:: + Para ejecutar el archivo :file:`requirements.txt`, abra una consola de comando, active el entorno + virtual Python, y te ubicas en el directorio donde descargo el archivo, entonces ejecute el siguiente + comando: + + .. code-block:: console + + pip3 install -r requirements.txt + + +.. raw:: html + :file: ../_templates/partials/soporte_profesional.html + + +.. + .. disqus:: + +.. _`pip`: https://es.wikipedia.org/wiki/Pip_(administrador_de_paquetes) diff --git a/source/conf.py b/source/conf.py index 7a3c795..4562f97 100644 --- a/source/conf.py +++ b/source/conf.py @@ -189,7 +189,7 @@ }, "site_url": "https://entrenamiento-python-basico.readthedocs.io/es/3/", "repo_url": "https://github.com/macagua/entrenamiento.python_basico", - "repo_name": "entrenamiento.frameworks_web_python", + "repo_name": "entrenamiento.python_basico", "edit_uri": "edit/3/source", "globaltoc_collapse": True, # BEGIN: Features @@ -588,6 +588,10 @@ "https://entrenamiento-python-avanzado.readthedocs.io/es/latest/", None, ), + "entrenamiento-frameworks-web-python": ( + "https://entrenamiento-frameworks-web-python.readthedocs.io/es/latest/", + None, + ), "entrenamiento-data-scientist-python": ( "https://entrenamiento-data-scientist-python.readthedocs.io/", None, diff --git a/source/esquema.rst b/source/esquema.rst index 0c3cb9b..a9881f9 100644 --- a/source/esquema.rst +++ b/source/esquema.rst @@ -29,7 +29,7 @@ Lección 2 - Introspección del lenguaje Python **Práctica:** Acceder al interprete Python demostrando la documentación propia integrada, analizar las estructuras de datos, métodos, clases y demás elementos disponibles del -lenguaje. Instalar el paquete :ref:`ipython ` y conocer sus ventajas. +lenguaje. Instalar el paquete :ref:`IPython ` y conocer sus ventajas. .. _esquema_entrenamiento_leccion3: @@ -72,12 +72,12 @@ explorar el resultado desde el interprete Python. .. _esquema_entrenamiento_leccion6: -Lección 6 - Introspección a la depuración con pdb -------------------------------------------------- +Lección 6 - Introspección a la depuración de software +----------------------------------------------------- -**Descripción:** Conocer las capacidades de depuración que ofrece el lenguaje. +**Descripción:** Conocer las capacidades de depuración de software que ofrece el lenguaje. -**Práctica:** Uso de la herramienta ``pdb`` y explorar el resultado en un módulo. +**Práctica:** Uso de uso de los módulos :ref:`pdb ` y :ref:`ipdb ` explorar el resultado en módulos a depurar. .. _esquema_entrenamiento_leccion7: @@ -125,7 +125,7 @@ Lección 10 - Uso prácticos de la librería estándar **Descripción:** Comprender el uso de los módulos incorporados en la :ref:`librería estándar ` de Python. -**Práctica:** Creación e uso de los módulos ``datetime``, ``locale``, ``email``, ``json``, de la +**Práctica:** Creación e uso de los módulos :mod:`datetime`, :mod:`locale`, :mod:`email`, :mod:`json`, de la :ref:`librería estándar ` explorando el resultado en un paquete Python en el sistema de archivos. diff --git a/source/glosario.rst b/source/glosario.rst index a159239..d5fbabf 100644 --- a/source/glosario.rst +++ b/source/glosario.rst @@ -96,7 +96,7 @@ A continuación una serie de términos usados en las tecnologías Python. plantilla 1) Una clase Python la cual controla la generación de un esqueleto. Las plantillas contiene una lista de variables para obtener la respuesta de un - usuario. Las plantillas son ejecutadas con el comando ``copier`` suministrando + usuario. Las plantillas son ejecutadas con el comando :command:`copier` suministrando el nombre de la plantilla como un argumento, como : ``copier copy gh:Tecnativa/doodba-copier-template ~/path/to/your/subproject``. diff --git a/source/index.rst b/source/index.rst index 53c8fd3..8ddfd49 100644 --- a/source/index.rst +++ b/source/index.rst @@ -56,6 +56,8 @@ Apéndices lecturas apendices/anexos apendices/operadores + apendices/entornos_virtuales + apendices/pip glosario copyright licencia diff --git a/source/leccion1/caracteristicas.rst b/source/leccion1/caracteristicas.rst index 6327951..07a2ac0 100644 --- a/source/leccion1/caracteristicas.rst +++ b/source/leccion1/caracteristicas.rst @@ -66,10 +66,10 @@ su ejecución: .. tip:: Para mayor información consulte la sección :ref:`Instalando Python en Windows `. -- Versiones Python para `macOS (Macintosh) `_ +- Versiones Python para `macOS `_ (arquitectura 32bit/64bit en presentación de instalador ejecutable). - .. tip:: Para mayor información consulte la sección :ref:`Instalando Python en una Mac `. + .. tip:: Para mayor información consulte la sección :ref:`Instalando Python en una macOS `. - Versiones Python en `código fuente `_ (archivo tarball del código fuente comprimido con XZ y con Gz). Para las mayoría de los sistemas diff --git a/source/leccion1/holamundo.rst b/source/leccion1/holamundo.rst index 9f2853e..fa5dcd7 100644 --- a/source/leccion1/holamundo.rst +++ b/source/leccion1/holamundo.rst @@ -47,7 +47,7 @@ Python. A continuación un procedimiento básico para las principales plataforma Ejecutar un programa en Windows ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Cree un directorio llamado ``proyectos`` la unidad ``C:\`` y dentro +Cree un directorio llamado :file:`proyectos` la unidad ``C:\`` y dentro de este, cree un archivo de texto plano con el siguiente nombre :file:`holamundo.py` y escriba la sintaxis de :ref:`Python 3 ` respectivamente. @@ -70,11 +70,11 @@ Ejecutar un programa en macOS #. Haga clic en ``Archivo`` y luego la nueva Ventana del ``Finder``. -#. Haga clic en ``Documentos``. +#. Haga clic en :file:`Documentos`. #. Haga clic en ``Archivo`` y luego en ``Nueva carpeta``. -#. Llame a la carpeta ``proyectos``. +#. Llame a la carpeta :file:`proyectos`. #. Usted va a almacenar todos los programas relacionados con la clase allí. @@ -93,7 +93,7 @@ Ejecutar un programa en macOS #. En el campo Guardar como: escriba :file:`holamundo.py`. -#. Seleccione ``Documentos`` y la carpeta de archivos ``proyectos``. +#. Seleccione la carpeta :file:`Documentos` y la carpeta de archivos :file:`proyectos`. #. Haga clic en ``Guardar``. @@ -101,17 +101,17 @@ Ejecutar un programa en macOS #. Seleccione ``Aplicaciones``, a continuación, ``Utilidades y Terminal``. -#. En la ventana ``Terminal`` ejecute ``ls`` y presione la tecla :keys:`Enter`. +#. En la ventana ``Terminal`` ejecute el comando :command:`ls` y presione la tecla :keys:`Enter`. Se debe dar una lista de todas las carpetas de nivel superior. Usted debe - ver la carpeta de ``Documentos``. + ver la carpeta de :file:`Documentos`. -#. Ejecute ``cd Documentos`` y presione la tecla :keys:`Enter`. +#. Ejecute el comando :command:`cd Documentos` y presione la tecla :keys:`Enter`. -#. Ejecute ``ls`` y presione la tecla :keys:`Enter` y debería ver la carpeta ``proyectos``. +#. Ejecute el comando :command:`ls` y presione la tecla :keys:`Enter` y debería ver la carpeta :file:`proyectos`. -#. Ejecute ``cd proyectos`` y presione la tecla :keys:`Enter`. +#. Ejecute el comando :command:`cd proyectos` y presione la tecla :keys:`Enter`. -#. Ejecute ``ls`` y presione la tecla :keys:`Enter` y usted debería ver el archivo :file:`holamundo.py`. +#. Ejecute el comando :command:`ls` y presione la tecla :keys:`Enter` y usted debería ver el archivo :file:`holamundo.py`. #. Para ejecutar el programa, escriba el siguiente comando :command:`python3 holamundo.py` y presione la tecla :keys:`Enter`. @@ -126,11 +126,11 @@ Enhorabuena, usted ha ejecutado su primer programa Python. Ejecutar un programa en Linux ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Cree un directorio llamado ``proyectos`` el ``home`` de su usuario +Cree un directorio llamado :file:`proyectos` el ``home`` de su usuario y dentro de este, cree un archivo de texto plano con el siguiente nombre :file:`holamundo.py` y escriba la sintaxis de :ref:`Python 3 ` respectivamente. -Luego ejecute desde la consola de comando el siguiente comando: +Luego desde la consola de comando ejecute el siguiente comando: .. code-block:: console @@ -143,14 +143,14 @@ Enhorabuena, usted ha ejecutado su primer programa Python. ---- .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion1/holamundo.py>`. + Usted puede descargar el código usado en esta sección haciendo clic: + + - :download:`holamundo.py <../../recursos/leccion1/holamundo.py>`. .. tip:: - Para ejecutar el código :file:`holamundo.py`, abra una - consola de comando, acceda al directorio donde se encuentra el mismo, - y ejecute el siguiente comando: + Para ejecutar el código :file:`holamundo.py`, abra una consola de comando, acceda al + directorio donde se encuentra el mismo, y ejecute el siguiente comando: .. code-block:: console diff --git a/source/leccion1/instalacion.rst b/source/leccion1/instalacion.rst index 34ea3d4..bd25111 100644 --- a/source/leccion1/instalacion.rst +++ b/source/leccion1/instalacion.rst @@ -12,24 +12,24 @@ ciertos recursos para los sistemas operativos más populares: Instalando Python en Windows ............................ -- `Instalando Python en Windows `_. +- `Instalando Python en Windows `_. -.. _python_instalacion_mac: +.. _python_instalacion_macos: -Instalando Python en una Mac -............................ +Instalando Python en macOS +.......................... -- `Instalando Python en una Mac `_. +- `Instalando Python en una macOS `_. .. _python_instalacion_linux: -Instalando Python en un Linux -............................. +Instalando Python en Linux +........................... En una distribución estándar Linux dispone por defecto el interprete Python instalado, para -comprobar la correcta instalación solamente debería ejecutar el comando en la consola: +comprobar la correcta instalación solamente debería ejecutar el comando en la consola: .. code-block:: console @@ -66,7 +66,7 @@ Si le muestra los mensajes anteriores esta correctamente instalado el interprete sudo apt install -y python3-dev - De nuevo vuelva a ejecutar en su consola de comando el comando :command:`python3`. + De nuevo vuelva a su consola de comando para ejecutar el comando :command:`python3`. ---- diff --git a/source/leccion1/ventajas_desventajas.rst b/source/leccion1/ventajas_desventajas.rst index 6f9543d..45fb201 100644 --- a/source/leccion1/ventajas_desventajas.rst +++ b/source/leccion1/ventajas_desventajas.rst @@ -36,7 +36,7 @@ Las ventajas del lenguaje Python son las siguientes: Los módulos están bien organizados, a diferencia de otros lenguajes. **Portable** - Es un lenguaje muy portable (ya sea en Mac, Linux o Windows) en comparación con otros + Es un lenguaje muy portable (ya sea en macOS, Linux o Windows) en comparación con otros lenguajes. La filosofía de baterías incluidas, son las librerías que más usted necesita al día a día de programación, ya están dentro del interprete, no tiene la necesidad de instalarlas adicionalmente con en otros lenguajes. @@ -51,16 +51,28 @@ Desventajas Las desventajas del lenguaje Python son las siguientes: -**Curva de aprendizaje** - La "curva de aprendizaje cuando ya estás en la parte web no es tan sencilla". - **Hosting** La mayoría de los servidores no tienen soporte a Python, y si lo soportan, la configuración es un poco difícil. -**Librerías incluidas** - Algunas librerías que trae por defecto no son del gusto de amplio de la comunidad, y optan - a usar librerías de terceros. +**Incompatibilidad con versiones anteriores** + Algunas bibliotecas y extensiones C pueden no estar listas o no haber migrado a Python 3.11 + justo después del lanzamiento. Puede haber cambios sutiles en el comportamiento que rompan + código existente. Python 3 no es compatible con Python 2, por lo que si usted tiene un programa + en Python 2 no podrá ejecutarlo en Python 3. Esto puede ser un problema si se necesita mantener + un programa antiguo. + +**Tiempo de adopción en entornos empresariales** + Aunque es más rápido, muchas empresas aún usan versiones LTS como Python 3.8 o 3.9 por temas de + compatibilidad y soporte. + +**Velocidad** + Python es un lenguaje interpretado, por lo que es más lento que otros lenguajes + compilados. Esto puede ser un problema si se necesita un rendimiento óptimo. + +**Cambios internos aún experimentales** + Algunas mejoras de rendimiento están en proceso de estabilización, lo que puede implicar bugs raros + en escenarios muy específicos. ---- diff --git a/source/leccion10/datetime.rst b/source/leccion10/datetime.rst index 4239614..a36a633 100644 --- a/source/leccion10/datetime.rst +++ b/source/leccion10/datetime.rst @@ -6,7 +6,7 @@ Módulo datetime .. note:: **Propósito:** Manipulación de valores de fecha y hora -El módulo `datetime`_ contiene funciones y clases para realizar análisis, formateo y +El módulo :mod:`datetime` contiene funciones y clases para realizar análisis, formateo y aritmética de fecha y hora, por separado y en conjunto. .. literalinclude:: ../../recursos/leccion10/datetime_date.py @@ -14,12 +14,6 @@ aritmética de fecha y hora, por separado y en conjunto. :linenos: :lines: 1-11 -El anterior código al ejecutar debe mostrar el siguiente mensaje: - -.. code-block:: console - - Fecha de nacimiento: 1980-12-03. - .. _python_fun_strftime: @@ -29,7 +23,7 @@ strftime ``strftime`` es un formateador de cadenas, esto formateará un objeto de fecha y hora en formato de :ref:`cadena de caracteres `. -Los objetos ``date``, ``datetime``, y ``time`` admiten un método ``strftime(format)``, +Los objetos ``date``, :mod:`datetime`, y :mod:`time` admiten un método ``strftime(format)``, para crear una cadena que represente el objeto de fecha y hora bajo el control de una :ref:`cadena de caracteres ` de formato explícito. @@ -38,12 +32,6 @@ para crear una cadena que represente el objeto de fecha y hora bajo el control d :linenos: :lines: 1-16 -El anterior código al ejecutar debe mostrar el siguiente mensaje: - -.. code-block:: console - - Fecha y lugar de nacimiento: 03 de December de 1980 en Maracaibo, Zulia, Venezuela. - .. _python_fun_strptime: @@ -54,7 +42,7 @@ strptime ``strptime`` es un analizador de :ref:`cadenas `, esto convertirá un formato de cadena a un objeto de fecha y hora. -El método de clase ``datetime.strptime()`` crea un objeto ``datetime`` a partir de una +El método de clase ``datetime.strptime()`` crea un objeto :mod:`datetime` a partir de una :ref:`cadena de caracteres ` que representa una fecha y hora y una :ref:`cadena ` de formato correspondiente. .. literalinclude:: ../../recursos/leccion10/datetime_strptime.py @@ -62,12 +50,6 @@ El método de clase ``datetime.strptime()`` crea un objeto ``datetime`` a partir :linenos: :lines: 1-15 -El anterior código al ejecutar debe mostrar el siguiente mensaje: - -.. code-block:: console - - Fecha y lugar de nacimiento: 03 de December de 1980 en Maracaibo, Zulia, Venezuela. - .. comments: .. todo:: @@ -103,18 +85,45 @@ El anterior código al ejecutar debe mostrar el siguiente mensaje: Si tiene la estructura de archivo previa, entonces ejecute los siguientes comandos: + Para ejecutar el código usando el módulo ``date``, abra una consola de comando, acceda + al directorio y ejecute el siguiente comando: + .. code-block:: console python3 datetime_date.py + El anterior código al ejecutar debe mostrar el siguiente mensaje: + + .. code-block:: console + + Fecha de nacimiento: 1980-12-03. + + Para ejecutar el código usando el método ``strftime``, abra una consola de comando, acceda + al directorio y ejecute el siguiente comando: + .. code-block:: console python3 datetime_strftime.py + El anterior código al ejecutar debe mostrar el siguiente mensaje: + + .. code-block:: console + + Fecha y lugar de nacimiento: 03 de December de 1980 en Maracaibo, Zulia, Venezuela. + + Para ejecutar el código usando el método ``strptime``, abra una consola de comando, acceda + al directorio y ejecute el siguiente comando: + .. code-block:: console python3 datetime_strptime.py + El anterior código al ejecutar debe mostrar el siguiente mensaje: + + .. code-block:: console + + Fecha y lugar de nacimiento: 03 de December de 1980 en Maracaibo, Zulia, Venezuela. + ---- @@ -133,5 +142,3 @@ El anterior código al ejecutar debe mostrar el siguiente mensaje: .. .. disqus:: - -.. _`datetime`: https://docs.python.org/es/3.11/library/datetime.html diff --git a/source/leccion10/email.rst b/source/leccion10/email.rst index b58b43f..36f97d1 100644 --- a/source/leccion10/email.rst +++ b/source/leccion10/email.rst @@ -9,17 +9,17 @@ Módulo email El correo electrónico es una de las formas más antiguas de comunicación digital, pero sigue siendo una de las más populares. La libraría estándar de Python incluye módulos para enviar, recibir y almacenar mensajes de correo electrónico por -medio de la librería `email`_. +medio de la librería :mod:`email`. -El módulo `smtplib`_ se comunica con un servidor de correo para entregar un mensaje. El módulo `smtpd`_ se +El módulo :mod:`smtplib` se comunica con un servidor de correo para entregar un mensaje. El módulo :mod:`smtpd` se puede utilizar para crear un servidor de correo personalizado y proporciona clases útiles para depurar la transmisión de correo electrónico en otras aplicaciones. -El módulo `imaplib`_ utiliza el protocolo `IMAP`_ para manipular mensajes almacenados en un servidor. +El módulo :mod:`imaplib` utiliza el protocolo `IMAP`_ para manipular mensajes almacenados en un servidor. Proporciona una API de bajo nivel para clientes ``IMAP`` y puede consultar, recuperar, mover y eliminar mensajes. -Los archivos de mensajes locales se pueden crear y modificar archivos ``mailbox`` usando el módulo `mailbox`_ +Los archivos de mensajes locales se pueden crear y modificar archivos ``mailbox`` usando el módulo :mod:`mailbox` utilizando varios formatos estándar, incluidos los populares formatos ``mbox`` y ``Maildir`` utilizados por muchos programas de clientes de correo electrónico. @@ -245,9 +245,4 @@ necesarios. .. disqus:: .. _`IMAP`: https://es.wikipedia.org/wiki/Protocolo_de_acceso_a_mensajes_de_Internet -.. _`email`: https://docs.python.org/es/3.11/library/email.html -.. _`smtplib`: https://docs.python.org/es/3.11/library/smtplib.html -.. _`smtpd`: https://docs.python.org/es/3.11/library/smtpd.html -.. _`imaplib`: https://docs.python.org/es/3.11/library/imaplib.html -.. _`mailbox`: https://docs.python.org/es/3.11/library/mailbox.html .. _`Template`: https://docs.python.org/es/3.11/library/string.html#template-strings diff --git a/source/leccion10/json.rst b/source/leccion10/json.rst index 9fa74fe..c281c0a 100644 --- a/source/leccion10/json.rst +++ b/source/leccion10/json.rst @@ -7,7 +7,7 @@ Módulo json **Propósito:** usar el módulo que incorpora Python para codificar y decodificar **JavaScript Object Notation** (:ref:`JSON `). -El módulo `json`_ expone una API familiar a los usuarios de los módulos de la biblioteca estándar `marshal`_ +El módulo :mod:`json` expone una API familiar a los usuarios de los módulos de la biblioteca estándar :mod:`marshal` y :ref:`pickle `. Este le permite codificar objetos de Python como cadenas en formato :ref:`JSON ` y decodifiquelas en objetos de Python. @@ -21,7 +21,7 @@ Práctica - Caso real ^^^^^^^^^^^^^^^^^^^^ A continuación se presenta una práctica más real de implementar el uso de proyectos -con el módulo ``json`` para leer y escribir un archivo JSON basado en un tipo :ref:`diccionario `: +con el módulo :mod:`json` para leer y escribir un archivo JSON basado en un tipo :ref:`diccionario `: Estructura de archivos @@ -31,7 +31,7 @@ Para crear la estructura de archivos del proyecto ``JSON`` debe ejecutar los sig .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL Crear y acceder al directorio ``json`` en un solo comando, ejecutando el siguiente comando: @@ -138,7 +138,7 @@ Módulo de principal del programa. INFO:root:✅ Se leyó el archivo JSON 'clientes.json'. - La ejecucion anterior generar la siguiente estructura: + La ejecución anterior generar la siguiente estructura: .. code-block:: console :class: no-copy @@ -154,7 +154,7 @@ Módulo de principal del programa. la cual no se incluye ya que cada vez que se inicia el programa :file:`json_reading_writing.py` se sustituye y crea nuevamente, para cuidar la creación de los datos iniciales. -Así de esta forma puede leer y escribir registros en un archivo JSON usando el módulo ``json``. +Así de esta forma puede leer y escribir registros en un archivo JSON usando el módulo :mod:`json`. ---- @@ -176,7 +176,5 @@ Así de esta forma puede leer y escribir registros en un archivo JSON usando el .. _`Standard ECMA-262 3rd Edition - Diciembre 1999`: https://ecma-international.org/wp-content/uploads/ECMA-262_3rd_edition_december_1999.pdf .. _`JavaScript`: https://es.wikipedia.org/wiki/JavaScript -.. _`marshal`: https://docs.python.org/es/3.11/library/marshal.html# -.. _`json`: https://docs.python.org/es/3.11/library/json.html .. _`formato JSON`: https://es.wikipedia.org/wiki/JSON .. _`API REST`: https://es.wikipedia.org/wiki/Transferencia_de_Estado_Representacional diff --git a/source/leccion10/libreria_estandar.rst b/source/leccion10/libreria_estandar.rst index b822a69..7ae5144 100644 --- a/source/leccion10/libreria_estandar.rst +++ b/source/leccion10/libreria_estandar.rst @@ -7,71 +7,71 @@ La `librería estándar`_ Python 3 incluye los siguientes módulos y librerías: - :ref:`Funciones integradas ` y funciones integradas no esenciales -- Constantes integradas, con el módulo `site`_. +- Constantes integradas, con el módulo :mod:`site`. - Tipos integrados, incluye 13 tipos, como :ref:`Booleano `, :ref:`Numérico ` y otros. - Manejo de :ref:`excepciones integradas `. -- Servicios :ref:`cadenas de caracteres `, incluye 11 librerías, como `string`_, `re`_ y otros. +- Servicios :ref:`cadenas de caracteres `, incluye 11 librerías, como :mod:`string`, :mod:`re` y otros. -- Tipos de datos, incluye 19 librerías, como :ref:`datetime `, `pprint`_ y otros. +- Tipos de datos, incluye 19 librerías, como :ref:`datetime `, :mod:`pprint` y otros. -- Módulos numéricos y matemáticos, incluye 9 librerías, como `decimal`_, `math`_ y otros. +- Módulos numéricos y matemáticos, incluye 9 librerías, como :mod:`decimal`, :mod:`math` y otros. -- Acceso a archivos y directorios, incluye 12 librerías, como `os.path`_, `fileinput`_ y otros. +- Acceso a archivos y directorios, incluye 12 librerías, como :mod:`os.path`, :mod:`fileinput` y otros. - Persistencia de datos, incluye 13 librerías, como :ref:`pickle `, :ref:`sqlite3 ` y otros. -- Compresión de datos y de archivo, incluye 5 librerías, como `zlib`_, `gzip`_ y otros. +- Compresión de datos y de archivo, incluye 5 librerías, como :mod:`zlib`, :mod:`gzip` y otros. -- Formatos de archivo, incluye 6 librerías, como `csv`_, `configparser`_ y otros. +- Formatos de archivo, incluye 6 librerías, como :mod:`csv`, :mod:`configparser` y otros. -- Servicios criptográficos, incluye 4 librerías, como `hashlib`_, `secrets`_ y otros. +- Servicios criptográficos, incluye 4 librerías, como :mod:`hashlib`, :mod:`secrets` y otros. -- Servicios genéricos del sistema operativo, incluye 17 librerías, como `os`_, `time`_ y otros. +- Servicios genéricos del sistema operativo, incluye 17 librerías, como :mod:`os`, :mod:`time` y otros. -- Servicios opcionales del sistema operativo, incluye 9 librerías, como `threading`_, `readline`_ y otros. +- Servicios opcionales del sistema operativo, incluye 9 librerías, como :mod:`threading`, :mod:`readline` y otros. -- Comunicación entre procesos y redes, incluye 7 librerías, como `subprocess`_, `socket`_ y otros. +- Comunicación entre procesos y redes, incluye 7 librerías, como :mod:`subprocess`, :mod:`socket` y otros. - Manejo de datos de Internet, incluye 16 librerías, como :ref:`email `, :ref:`json ` y otros. -- Procesamiento de marcado estructurado, incluye 15 librerías, como `html.parser`_, `html.entities`_ y otros. +- Procesamiento de marcado estructurado, incluye 15 librerías, como :mod:`html.parser`, :mod:`html.entities` y otros. -- Protocolos de Internet y soporte, incluye 25 librerías, como `cgi`_, `wsgiref`_ y otros. +- Protocolos de Internet y soporte, incluye 25 librerías, como :mod:`cgi`, :mod:`wsgiref` y otros. -- Servicios multimedia, incluye 10 librerías, como `audioop`_, `wave`_ y otros. +- Servicios multimedia, incluye 10 librerías, como :mod:`audioop`, :mod:`wave` y otros. -- Internacionalización, incluye las librerías `gettext`_ y `locale`_. +- Internacionalización, incluye las librerías :mod:`gettext` y :mod:`locale`. -- Program Frameworks, incluye las librerías `cmd`_ y `shlex`_. +- Program Frameworks, incluye las librerías :mod:`cmd` y :mod:`shlex`. -- Interfaces gráficas de usuario con Tk, incluye 7 librerías, como `tkinter`_, `IDLE`_ y otros. +- Interfaces gráficas de usuario con Tk, incluye 7 librerías, como :mod:`tkinter`, `IDLE`_ y otros. -- Herramientas de desarrollo, incluye 6 librerías, como `unittest`_, `test`_ y otros. +- Herramientas de desarrollo, incluye 6 librerías, como :mod:`unittest`, :mod:`test` y otros. -- Depuración y Profiling, incluye 7 librerías, como :ref:`pdb `, `trace`_ y otros. +- Depuración y Profiling, incluye 7 librerías, como :ref:`pdb `, :mod:`trace` y otros. -- Empaquetado y distribución de software, incluye las librerías `distutils`_ y `ensurepip`_. +- Empaquetado y distribución de software, incluye las librerías :mod:`distutils` y :mod:`ensurepip`. -- Python Runtime Services, incluye 16 librerías, como `sys`_, `site`_ y otros. +- Python Runtime Services, incluye 16 librerías, como :mod:`sys`, :mod:`site` y otros. -- Intérpretes de Python personalizados, incluye las librerías `code`_ y `codeop`_. +- Intérpretes de Python personalizados, incluye las librerías :mod:`code` y :mod:`codeop`. -- Importación de módulos, incluye 7 librerías, como `imp`_, `runpy`_ y otros. +- Importación de módulos, incluye 7 librerías, como :mod:`imp`, :mod:`runpy` y otros. -- Python Language Services, incluye 13 librerías, como `dis`_ y otros. +- Python Language Services, incluye 13 librerías, como :mod:`dis` y otros. - Paquete compilador de Python, incluye 5 librerías. - Servicios Misceláneos incluidos. -- Servicios específicos de MS Windows, incluye 4 librerías, como `msilib`_, `winsound`_ y otros. +- Servicios específicos de MS Windows, incluye 4 librerías, como :mod:`msilib`, :mod:`winsound` y otros. -- Servicios específicos de Unix, incluye 16 librerías, como `subprocess`_, `syslog`_ y otros. +- Servicios específicos de Unix, incluye 16 librerías, como :mod:`subprocess`, :mod:`syslog` y otros. -- Acceso a dispositivos de audio compatibles con Open Sound System - OSS, la librería `ossaudiodev`_. +- Acceso a dispositivos de audio compatibles con Open Sound System - OSS, la librería :mod:`ossaudiodev`. ---- @@ -93,50 +93,4 @@ La `librería estándar`_ Python 3 incluye los siguientes módulos y librerías: .. disqus:: .. _`librería estándar`: https://docs.python.org/es/3.11/library/index.html -.. _`site`: https://docs.python.org/es/3.11/library/site.html -.. _`pprint`: https://docs.python.org/es/3.11/library/pprint.html -.. _`string`: https://docs.python.org/es/3.11/library/string.html -.. _`re`: https://docs.python.org/es/3.11/library/re.html -.. _`decimal`: https://docs.python.org/es/3.11/library/decimal.html -.. _`math`: https://docs.python.org/es/3.11/library/math.html -.. _`os.path`: https://docs.python.org/es/3.11/library/os.path.html -.. _`fileinput`: https://docs.python.org/es/3.11/library/fileinput.html -.. _`zlib`: https://docs.python.org/es/3.11/library/zlib.html -.. _`gzip`: https://docs.python.org/es/3.11/library/gzip.html -.. _`csv`: https://docs.python.org/es/3.11/library/csv.html -.. _`configparser`: https://docs.python.org/es/3.11/library/configparser.html -.. _`hashlib`: https://docs.python.org/es/3.11/library/hashlib.html -.. _`secrets`: https://docs.python.org/es/3.11/library/secrets.html -.. _`os`: https://docs.python.org/es/3.11/library/os.html -.. _`time`: https://docs.python.org/es/3.11/library/time.html -.. _`threading`: https://docs.python.org/es/3.11/library/threading.html -.. _`readline`: https://docs.python.org/es/3.11/library/readline.html -.. _`subprocess`: https://docs.python.org/es/3.11/library/subprocess.html -.. _`socket`: https://docs.python.org/es/3.11/library/socket.html -.. _`html.entities`: https://docs.python.org/es/3.11/library/html.entities.html -.. _`html.parser`: https://docs.python.org/es/3.11/library/html.parser.html -.. _`cgi`: https://docs.python.org/es/3.11/library/cgi.html -.. _`wsgiref`: https://docs.python.org/es/3.11/library/wsgiref.html -.. _`audioop`: https://docs.python.org/es/3.11/library/audioop.html -.. _`wave`: https://docs.python.org/es/3.11/library/wave.html -.. _`gettext`: https://docs.python.org/es/3.11/library/gettext.html -.. _`locale`: https://docs.python.org/es/3.11/library/locale.html -.. _`shlex`: https://docs.python.org/es/3.11/library/shlex.html -.. _`cmd`: https://docs.python.org/es/3.11/library/cmd.html -.. _`tkinter`: https://docs.python.org/es/3.11/library/tkinter.html -.. _`IDLE`: https://docs.python.org/es/3.11/library/idle.html -.. _`unittest`: https://docs.python.org/es/3.11/library/unittest.html -.. _`test`: https://docs.python.org/es/3.11/library/test.html -.. _`trace`: https://docs.python.org/es/3.11/library/trace.html -.. _`distutils`: https://docs.python.org/es/3.11/library/distutils.html -.. _`ensurepip`: https://docs.python.org/es/3.11/library/ensurepip.html -.. _`sys`: https://docs.python.org/es/3.11/library/sys.html -.. _`code`: https://docs.python.org/es/3.11/library/code.html -.. _`codeop`: https://docs.python.org/es/3.11/library/codeop.html -.. _`imp`: https://docs.python.org/es/3.11/library/imp.html -.. _`runpy`: https://docs.python.org/es/3.11/library/runpy.html -.. _`dis`: https://docs.python.org/es/3.11/library/dis.html -.. _`msilib`: https://docs.python.org/es/3.11/library/msilib.html -.. _`winsound`: https://docs.python.org/es/3.11/library/winsound.html -.. _`syslog`: https://docs.python.org/es/3.11/library/syslog.html -.. _`ossaudiodev`: https://docs.python.org/es/3.11/library/ossaudiodev.html +.. _`IDLE`: https://docs.python.org/es/3.11/library/idle.html#idle diff --git a/source/leccion10/listas_comprension.rst b/source/leccion10/listas_comprension.rst index 6432191..db879dd 100644 --- a/source/leccion10/listas_comprension.rst +++ b/source/leccion10/listas_comprension.rst @@ -235,8 +235,11 @@ Así queda el archivo manipulado: .. important:: Usted puede descargar el código usado en esta sección haciendo clic en los - siguientes enlaces: :download:`listas_comprension_archivo.py <../../recursos/leccion10/listas_comprension_archivo.py>` - y :download:`listas_comprension_archivo.txt <../../recursos/leccion10/listas_comprension_archivo.txt>`. + siguientes enlaces: + + - :download:`listas_comprension_archivo.py <../../recursos/leccion10/listas_comprension_archivo.py>`. + + - :download:`listas_comprension_archivo.txt <../../recursos/leccion10/listas_comprension_archivo.txt>`. .. tip:: diff --git a/source/leccion10/locale.rst b/source/leccion10/locale.rst index 6d0664b..411faea 100644 --- a/source/leccion10/locale.rst +++ b/source/leccion10/locale.rst @@ -6,15 +6,15 @@ Módulo locale .. note:: **Propósito:** Formateo según la configuración regional, como servicios de internacionalización -El módulo `locale`_ abre el acceso a la base de datos y la funcionalidad de `POSIX locale`_. +El módulo :mod:`locale` abre el acceso a la base de datos y la funcionalidad de `POSIX locale`_. El mecanismo `POSIX locale`_ permite a los programadores tratar ciertos problemas culturales en una aplicación, sin requerir que el programador conozca todos los detalles de cada país donde se ejecuta el software. -El módulo ``locale`` se implementa en la parte superior del módulo ``_locale``, que a su vez +El módulo :mod:`locale` se implementa en la parte superior del módulo ``_locale``, que a su vez utiliza una implementación de configuración regional ANSI C si está disponible. -Uso del módulo ``locale``: +Uso del módulo :mod:`locale`: .. literalinclude:: ../../recursos/leccion10/locales.py @@ -22,181 +22,61 @@ Uso del módulo ``locale``: :linenos: :lines: 1-27 -El anterior código al ejecutar debe mostrar el siguiente mensaje: +Jugando con el módulo :mod:`locale` en el interprete :ref:`IPython `: -.. code-block:: console - - miércoles, 03. diciembre 1980 12:00am - -Jugando con el módulo ``locale`` en el interprete :ref:`ipython `: +Obtener el nombre del mes de Diciembre en base a la configuración regional actual: .. code-block:: pycon + :class: no-copy In [1]: import locale In [2]: locale.setlocale(locale.LC_TIME,'') - Out[3]: 'es_VE.UTF-8' + Out[2]: 'es_VE.UTF-8' In [3]: locale.nl_langinfo(locale.MON_12).capitalize() Out[3]: 'Diciembre' - In [4]: dir(locale) - Out[4]: - ['ABDAY_1', - 'ABDAY_2', - 'ABDAY_3', - 'ABDAY_4', - 'ABDAY_5', - 'ABDAY_6', - 'ABDAY_7', - 'ABMON_1', - 'ABMON_10', - 'ABMON_11', - 'ABMON_12', - 'ABMON_2', - 'ABMON_3', - 'ABMON_4', - 'ABMON_5', - 'ABMON_6', - 'ABMON_7', - 'ABMON_8', - 'ABMON_9', - 'ALT_DIGITS', - 'AM_STR', - 'CHAR_MAX', - 'CODESET', - 'CRNCYSTR', - 'DAY_1', - 'DAY_2', - 'DAY_3', - 'DAY_4', - 'DAY_5', - 'DAY_6', - 'DAY_7', - 'D_FMT', - 'D_T_FMT', - 'ERA', - 'ERA_D_FMT', - 'ERA_D_T_FMT', - 'ERA_T_FMT', - 'Error', - 'LC_ALL', - 'LC_COLLATE', - 'LC_CTYPE', - 'LC_MESSAGES', - 'LC_MONETARY', - 'LC_NUMERIC', - 'LC_TIME', - 'MON_1', - 'MON_10', - 'MON_11', - 'MON_12', - 'MON_2', - 'MON_3', - 'MON_4', - 'MON_5', - 'MON_6', - 'MON_7', - 'MON_8', - 'MON_9', - 'NOEXPR', - 'PM_STR', - 'RADIXCHAR', - 'THOUSEP', - 'T_FMT', - 'T_FMT_AMPM', - 'YESEXPR', - '__all__', - '__builtins__', - '__cached__', - '__doc__', - '__file__', - '__loader__', - '__name__', - '__package__', - '__spec__', - '_append_modifier', - '_build_localename', - '_builtin_str', - '_format', - '_group', - '_grouping_intervals', - '_localeconv', - '_override_localeconv', - '_parse_localename', - '_percent_re', - '_print_locale', - '_replace_encoding', - '_setlocale', - '_strcoll', - '_strip_padding', - '_strxfrm', - '_test', - 'atof', - 'atoi', - 'bind_textdomain_codeset', - 'bindtextdomain', - 'collections', - 'currency', - 'dcgettext', - 'delocalize', - 'dgettext', - 'encodings', - 'format', - 'format_string', - 'functools', - 'getdefaultlocale', - 'getlocale', - 'getpreferredencoding', - 'gettext', - 'k', - 'locale_alias', - 'locale_encoding_alias', - 'localeconv', - 'nl_langinfo', - 'normalize', - 're', - 'resetlocale', - 'setlocale', - 'str', - 'strcoll', - 'strxfrm', - 'sys', - 'textdomain', - 'v', - 'windows_locale'] - - In [4]: import datetime - - In [5]: dt = datetime.datetime(2015, 11, 15, 16, 30) - - In [6]: dt - Out[6]: datetime.datetime(2015, 11, 15, 16, 30) - - In [7]: locale.setlocale(locale.LC_ALL, "es_VE.UTF-8") - Out[7]: 'es_VE.UTF-8' - - In [8]: print(dt.strftime("%A, %d. %B %Y %I:%M%p")) - domingo, 15. noviembre 2015 04:30pm - - In [9]: import os - - In [10]: os.environ['LANG'] - Out[10]: 'es_VE.UTF-8' - - In [11]: locale.setlocale(locale.LC_ALL, "") - Out[11]: 'es_VE.UTF-8' - - In [12]: locale.setlocale(locale.LC_ALL, "es_VE.UTF-8") - Out[12]: 'es_VE.UTF-8' - - In [13]: locale.setlocale(locale.LC_ALL, str(locale.getlocale()[0]) + "." + str(locale.getlocale()[1])) - Out[13]: 'es_VE.UTF-8' - -.. comments: - - .. todo:: - TODO Terminar de escribir esta sección. +Obtener el formato de fecha y hora en base a la configuración regional actual: + +.. code-block:: pycon + :class: no-copy + + In [1]: import locale + + In [2]: import datetime + + In [3]: dt = datetime.datetime(2015, 11, 15, 16, 30) + + In [4]: dt + Out[4]: datetime.datetime(2015, 11, 15, 16, 30) + + In [5]: locale.setlocale(locale.LC_ALL, "es_VE.UTF-8") + Out[5]: 'es_VE.UTF-8' + + In [6]: print(dt.strftime("%A, %d. %B %Y %I:%M%p")) + Out[6]: domingo, 15. noviembre 2015 04:30pm + +Obtener el valor de la variable de entorno ``LANG`` en base a la configuración regional actual: + +.. code-block:: pycon + :class: no-copy + + In [1]: import locale + + In [2]: import os + + In [3]: os.environ['LANG'] + Out[3]: 'es_VE.UTF-8' + + In [4]: locale.setlocale(locale.LC_ALL, "") + Out[4]: 'es_VE.UTF-8' + + In [5]: locale.setlocale(locale.LC_ALL, "es_VE.UTF-8") + Out[5]: 'es_VE.UTF-8' + + In [6]: locale.setlocale(locale.LC_ALL, str(locale.getlocale()[0]) + "." + str(locale.getlocale()[1])) + Out[6]: 'es_VE.UTF-8' ---- @@ -226,6 +106,12 @@ Jugando con el módulo ``locale`` en el interprete :ref:`ipython `. +de trabajo con el paquete :ref:`IPython `. -Para mayor información visite su página principal de `interprete bpython`_ y si necesita -instalar este programa ejecute el siguiente comando, el cual a continuación se presentan -el correspondiente comando de tu sistema operativo: +.. tip:: + Para mayor información visite su página principal de `interprete bpython`_. + +Para instalar este paquete ``bpython`` use la herramienta :ref:`pip ` +ejecutando el siguiente comando, el cual a continuación se presentan el correspondiente +comando de tu sistema operativo: .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console @@ -25,13 +28,13 @@ el correspondiente comando de tu sistema operativo: pip install bpython -Luego sustituya el comando ``python`` por ``bpython`` correspondiente a tu sistema +Luego sustituya el comando :command:`python` por :command:`bpython` correspondiente a tu sistema operativo de la siguiente forma: .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console diff --git a/source/leccion2/index.rst b/source/leccion2/index.rst index 4752695..22c3798 100644 --- a/source/leccion2/index.rst +++ b/source/leccion2/index.rst @@ -6,10 +6,10 @@ Introspección del lenguaje Python En Python siendo un lenguaje interpretado tiene a disposición un shell de comando para hacer introspección del lenguaje, ademas también existe una forma de hacer más interactiva la introspección del lenguaje, usando -el interprete :ref:`ipython ` o ``bpython``. +el interprete :ref:`IPython ` o ``bpython``. En esta lección se busca introducir a la introspección del lenguaje Python -usando el interprete como el modo interactivo del paquete adicional :ref:`ipython `, +usando el interprete como el modo interactivo del paquete adicional :ref:`IPython `, y las ventajas aplicar la técnica de **introspección** en sus prácticas de programación diarias con el lenguaje. diff --git a/source/leccion2/interactivo.rst b/source/leccion2/interactivo.rst index c419f2f..f5d41cd 100644 --- a/source/leccion2/interactivo.rst +++ b/source/leccion2/interactivo.rst @@ -36,14 +36,14 @@ factores: interprete, por mucho tiempo no estaba disponible documentación tipo `Javadoc`_ o `diagramas de clases`_ del propio lenguaje por lo cual muchas programadores **Python** se acostumbraron a estudiar su código de - esta forma, así que le recomiendo que use el interprete ``python`` para + esta forma, así que le recomiendo que use el interprete :command:`python` para eso. - Hoy en día existente herramientas que te permiten generar documentación desde los códigos fuentes Python como `Sphinx`_. La forma más fácil es iniciar tu relación con Python simplemente ejecutando -el comando ``python`` de la siguiente forma: +el comando :command:`python` de la siguiente forma: .. code-block:: console @@ -216,7 +216,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: Enter any module name to get more help. Or, type "modules spam" to search for modules whose name or summary contain the string "spam". -Entonces consulte la ayuda del módulo ``os``, ejecutando: +Entonces consulte la ayuda del módulo :mod:`os`, ejecutando: .. code-block:: pycon @@ -263,7 +263,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: (e.g., split and join). : -.. tip:: Presione la tecla :keys:`q` para salir de la ayuda del módulo ``os``. +.. tip:: Presione la tecla :keys:`q` para salir de la ayuda del módulo :mod:`os`. Seguidamente presione la combinación de tecla :keys:`Crtl+d` para salir de la ayuda. @@ -368,7 +368,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: '/usr/lib/python3.11/os.py' >>> -También puede consultar la documentación de la librería ``os`` ejecutando el +También puede consultar la documentación de la librería :mod:`os` ejecutando el siguiente comando: .. code-block:: pycon diff --git a/source/leccion2/ipython.rst b/source/leccion2/ipython.rst index adb729c..2225756 100644 --- a/source/leccion2/ipython.rst +++ b/source/leccion2/ipython.rst @@ -14,22 +14,26 @@ Según Wikipedia mediante tabulador de variables, módulos y atributos; entre otras funcionalidades. Es un componente del paquete `SciPy`_." -Para mayor información visite su página principal de ``ipython`` y si necesita instalar -este programa ejecute el siguiente comando: +.. tip:: + Para mayor información visite su página principal de `ipython`_. + +Para instalar este paquete ``ipython`` use la herramienta :ref:`pip ` +ejecutando el siguiente comando, el cual a continuación se presentan el correspondiente +comando de tu sistema operativo: .. tabs:: - .. group-tab:: PIP + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console - pip3 install ipython + sudo apt install -y ipython - .. group-tab:: Ubuntu/Debian Linux + .. group-tab:: PIP .. code-block:: console - sudo apt install -y ipython + pip3 install ipython .. group-tab:: Windows @@ -41,7 +45,7 @@ Sustituya el comando :command:`python3` por el comando :command:`ipython3` de la .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console @@ -69,14 +73,14 @@ Sustituya el comando :command:`python3` por el comando :command:`ipython3` de la .. code-block:: console :class: no-copy - Python 3.11.5 (default, Sep 11 2023, 13:26:23) + Python 3.11.2 (main, Nov 30 2024, 21:22:50) [GCC 12.2.0] Type 'copyright', 'credits' or 'license' for more information - IPython 7.34.0 -- An enhanced Interactive Python. Type '?' for help. + IPython 8.10.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: -Un ejemplo de uso del comando ``help`` es consultar la ayuda del comando +Un ejemplo de uso del comando :command:`help` es consultar la ayuda del comando ``dir`` y se ejecuta de la siguiente forma: .. code-block:: pycon @@ -107,7 +111,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: Entonces presione la tecla :keys:`q` para salir de la ayuda de la función ``dir()``. -De nuevo realice la importación de la :ref:`librería del estándar Python ` llamada ``os``. +De nuevo realice la importación de la :ref:`librería del estándar Python ` llamada :mod:`os`. .. code-block:: pycon @@ -115,7 +119,7 @@ De nuevo realice la importación de la :ref:`librería del estándar Python `. diff --git a/source/leccion3/operadores_asignaciones.rst b/source/leccion3/operadores_asignaciones.rst index 0140e53..e70fd14 100644 --- a/source/leccion3/operadores_asignaciones.rst +++ b/source/leccion3/operadores_asignaciones.rst @@ -239,7 +239,6 @@ A continuación, se presentan algunos ejemplos de su uso: Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`operadores_asignaciones.py <../../recursos/leccion3/operadores_asignaciones.py>`. diff --git a/source/leccion3/operadores_relacionales.rst b/source/leccion3/operadores_relacionales.rst index 2b91ea5..3463934 100644 --- a/source/leccion3/operadores_relacionales.rst +++ b/source/leccion3/operadores_relacionales.rst @@ -171,7 +171,6 @@ A continuación, se presentan algunos ejemplos de su uso: Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`operadores_relacionales.py <../../recursos/leccion3/operadores_relacionales.py>`. diff --git a/source/leccion3/tipo_booleanos.rst b/source/leccion3/tipo_booleanos.rst index ab935dd..8b3f04d 100644 --- a/source/leccion3/tipo_booleanos.rst +++ b/source/leccion3/tipo_booleanos.rst @@ -153,7 +153,6 @@ Para salir de esa ayuda presione la tecla :keys:`q`. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`tipo_booleanos.py <../../recursos/leccion3/tipo_booleanos.py>`. diff --git a/source/leccion3/tipo_cadenas.rst b/source/leccion3/tipo_cadenas.rst index 572605d..c6bae01 100644 --- a/source/leccion3/tipo_cadenas.rst +++ b/source/leccion3/tipo_cadenas.rst @@ -874,7 +874,6 @@ Para salir de esa ayuda presione la tecla :keys:`q`. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`tipo_cadenas.py <../../recursos/leccion3/tipo_cadenas.py>`. diff --git a/source/leccion3/tipo_conjuntos.rst b/source/leccion3/tipo_conjuntos.rst index 1ec3063..c68e5a6 100644 --- a/source/leccion3/tipo_conjuntos.rst +++ b/source/leccion3/tipo_conjuntos.rst @@ -530,7 +530,6 @@ Para salir de esa ayuda presione la tecla :keys:`q`. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`tipo_conjuntos.py <../../recursos/leccion3/tipo_conjuntos.py>`. diff --git a/source/leccion3/tipo_diccionarios.rst b/source/leccion3/tipo_diccionarios.rst index d57ee94..60f83ca 100644 --- a/source/leccion3/tipo_diccionarios.rst +++ b/source/leccion3/tipo_diccionarios.rst @@ -639,7 +639,6 @@ Para salir de esa ayuda presione la tecla :keys:`q`. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`tipo_diccionarios.py <../../recursos/leccion3/tipo_diccionarios.py>`. diff --git a/source/leccion3/tipo_listas.rst b/source/leccion3/tipo_listas.rst index aef6104..c101659 100644 --- a/source/leccion3/tipo_listas.rst +++ b/source/leccion3/tipo_listas.rst @@ -448,7 +448,6 @@ Para salir de esa ayuda presione la tecla :keys:`q`. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`tipo_listas.py <../../recursos/leccion3/tipo_listas.py>`. diff --git a/source/leccion3/tipo_numericos.rst b/source/leccion3/tipo_numericos.rst index 61fca3b..2f9b995 100644 --- a/source/leccion3/tipo_numericos.rst +++ b/source/leccion3/tipo_numericos.rst @@ -228,7 +228,6 @@ Para salir de esa ayuda presione la tecla :keys:`q`. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`tipo_numericos.py <../../recursos/leccion3/tipo_numericos.py>`. diff --git a/source/leccion3/tipo_tuplas.rst b/source/leccion3/tipo_tuplas.rst index fc88446..f289a96 100644 --- a/source/leccion3/tipo_tuplas.rst +++ b/source/leccion3/tipo_tuplas.rst @@ -185,7 +185,6 @@ Para salir de esa ayuda presione la tecla :keys:`q`. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`tipo_tuplas.py <../../recursos/leccion3/tipo_tuplas.py>`. diff --git a/source/leccion3/variables_constantes.rst b/source/leccion3/variables_constantes.rst index d8ad5b8..3b65bed 100644 --- a/source/leccion3/variables_constantes.rst +++ b/source/leccion3/variables_constantes.rst @@ -207,7 +207,7 @@ En el programa anterior, existe un archivo de módulo :file:`constantes.py`. Ent en este se asignan los valores de constantes ``IP_DB_SERVER``, ``PORT_DB_SERVER``, ``USER_DB_SERVER``, ``PASSWORD_DB_SERVER`` y ``DB_NAME``. Ademas, existe el archivo de módulo :file:`main.py` el cual importa el módulo ``constantes``. Finalmente, se -imprime una linea de conexión del comando ``scp`` de Linux usando la función +imprime una linea de conexión del comando :command:`scp` de Linux usando la función integrada en la :ref:`librería estándar ` de Python llamada :ref:`format() `. .. note:: @@ -463,7 +463,6 @@ precaución. Usted puede descargar el código usado en esta sección haciendo clic en los siguientes enlaces: - - :download:`constantes.py <../../recursos/leccion3/constantes.py>`. - :download:`main.py <../../recursos/leccion3/main.py>`. diff --git a/source/leccion4/condicional_if.rst b/source/leccion4/condicional_if.rst index c1d4392..1021cd8 100644 --- a/source/leccion4/condicional_if.rst +++ b/source/leccion4/condicional_if.rst @@ -183,8 +183,10 @@ A continuación, se presenta un ejemplo del uso de condicionales ``if``: .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion4/condicional_if.py>`. + Usted puede descargar el código usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`condicional_if.py <../../recursos/leccion4/condicional_if.py>`. .. tip:: diff --git a/source/leccion4/operadores_identidad.rst b/source/leccion4/operadores_identidad.rst index f72050f..96d1ce3 100644 --- a/source/leccion4/operadores_identidad.rst +++ b/source/leccion4/operadores_identidad.rst @@ -122,8 +122,10 @@ El código anterior muestra el siguiente resultado: .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion4/operadores_identidad.py>`. + Usted puede descargar el código usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`operadores_identidad.py <../../recursos/leccion4/operadores_identidad.py>`. .. tip:: diff --git a/source/leccion4/operadores_logicos.rst b/source/leccion4/operadores_logicos.rst index a28f58b..8f3d4e6 100644 --- a/source/leccion4/operadores_logicos.rst +++ b/source/leccion4/operadores_logicos.rst @@ -96,8 +96,10 @@ A continuación, se presentan algunos ejemplos de su uso: .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion4/operadores_logicos.py>`. + Usted puede descargar el código usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`operadores_logicos.py <../../recursos/leccion4/operadores_logicos.py>`. .. tip:: diff --git a/source/leccion4/operadores_pertenencia.rst b/source/leccion4/operadores_pertenencia.rst index 127ff23..ba6198c 100644 --- a/source/leccion4/operadores_pertenencia.rst +++ b/source/leccion4/operadores_pertenencia.rst @@ -80,8 +80,10 @@ A continuación, se presentan algunos ejemplos de su uso: .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion4/operadores_pertenencia.py>`. + Usted puede descargar el código usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`operadores_pertenencia.py <../../recursos/leccion4/operadores_pertenencia.py>`. .. tip:: diff --git a/source/leccion5/decoradores.rst b/source/leccion5/decoradores.rst index 0d3d341..8a6cd71 100644 --- a/source/leccion5/decoradores.rst +++ b/source/leccion5/decoradores.rst @@ -282,7 +282,7 @@ Autorización Los decoradores permiten verificar si alguien está o no autorizado a usar una determinada función, por ejemplo en una aplicación web. Son muy usados en *frameworks* -como :ref:`Flask ` o :ref:`Django `. +como :ref:`Flask ` o :ref:`Django `. Aquí se muestra como usar un decorador para verificar que se está autenticado. **Ejemplo:** @@ -468,4 +468,3 @@ como decorador tendrá el mismo comportamiento, pero además enviará un correo .. .. disqus:: - diff --git a/source/leccion5/funciones.rst b/source/leccion5/funciones.rst index 37b475b..f2bf23c 100644 --- a/source/leccion5/funciones.rst +++ b/source/leccion5/funciones.rst @@ -432,8 +432,10 @@ Y se llama de la siguiente forma: .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion5/funciones.py>`. + Usted puede descargar el código usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`funciones.py <../../recursos/leccion5/funciones.py>`. .. tip:: diff --git a/source/leccion5/funciones_orden_superior.rst b/source/leccion5/funciones_orden_superior.rst index 07f4f41..ef65583 100644 --- a/source/leccion5/funciones_orden_superior.rst +++ b/source/leccion5/funciones_orden_superior.rst @@ -252,7 +252,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: ['os.pyc', 'os.py'] En el ejemplo anterior se usa el método ``os.__file__`` para obtener la ruta donde -esta instalada el módulo ``os`` en su sistema, ejecutando la siguiente sentencia: +esta instalada el módulo :mod:`os` en su sistema, ejecutando la siguiente sentencia: .. code-block:: pycon @@ -266,7 +266,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: '/usr/lib/python3.11/os.pyc' -Si con el método ``os.__file__`` obtiene la ruta del módulo ``os`` con el método +Si con el método ``os.__file__`` obtiene la ruta del módulo :mod:`os` con el método ``replace("/os.pyc", "/")`` busca la cadena de carácter "/os.pyc" y la remplaza por la cadena de carácter "/" @@ -284,7 +284,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: Luego se define la variable ``archivos`` generando una lista de archivos usando la función ``os.listdir()``, pasando el parámetro obtenido de la ruta donde se instalo -el módulo ``os`` ejecutando en el comando previo, con la siguiente sentencia: +el módulo :mod:`os` ejecutando en el comando previo, con la siguiente sentencia: .. code-block:: pycon diff --git a/source/leccion6/depuracion.rst b/source/leccion6/depuracion.rst deleted file mode 100644 index 9acbdb2..0000000 --- a/source/leccion6/depuracion.rst +++ /dev/null @@ -1,426 +0,0 @@ -.. _python_modulo_pdb: - -Módulo pdb ----------- - -En este tutorial se exploran herramientas que ayudan a entender tu -código: depuración para encontrar y corregir *bugs* (errores). - -El depurador python, `pdb `_, -te permite inspeccionar tu código de forma interactiva. - -Te permite: - -- Ver el código fuente. - -- Ir hacia arriba y hacia abajo del punto donde se ha producido - un error. - -- Inspeccionar valores de variables. - -- Modificar valores de variables. - -- Establecer ``breakpoints`` (punto de parada del proceso). - -.. topic:: **print** - - Sí, las declaraciones :ref:`print ` sirven como herramienta de depuración. - Sin embargo, para inspeccionar en tiempo de ejecución es más - eficiente usar el depurador. - - -Invocando al depurador -...................... - -Formas de lanzar el depurador: - -#. Postmortem, lanza el depurador después de que se hayan producido - errores. - -#. Lanza el módulo con el depurador. - -#. Llama al depurador desde dentro del módulo. - - -Postmortem -~~~~~~~~~~ - -**Situación**: Estás trabajando en el interprete :ref:`ipython ` y obtienes un error (:ref:`traceback `). - -En este caso esta depurando el archivo :download:`index_error.py <../../recursos/leccion6/index_error.py>`. Cuando lo ejecutes verás como se lanza una excepción :ref:`IndexError `. Escribe ``%debug`` y entrarás en el depurador. - -.. code-block:: pycon - - In [1]: %run index_error.py - --------------------------------------------------------------------------- - IndexError Traceback (most recent call last) - /home/macagua/python/entrenamiento/index_error.py in () - 6 - 7 if __name__ == '__main__': - ----> 8 index_error() - 9 - - /home/macagua/python/entrenamiento/index_error.py in index_error() - 3 def index_error(): - 4 lst = list('foobar') - ----> 5 print(lst[len(lst)]) - 6 - 7 if __name__ == '__main__': - - IndexError: list index out of range - - In [2]: %debug - > /home/macagua/python/entrenamiento/index_error.py(5)index_error() - 4 lst = list('foobar') - ----> 5 print(lst[len(lst)]) - 6 - - ipdb> list - 1 """Small snippet to raise an IndexError.""" - 2 - 3 def index_error(): - 4 lst = list('foobar') - ----> 5 print(lst[len(lst)]) - 6 - 7 if __name__ == '__main__': - 8 index_error() - 9 - - ipdb> len(lst) - 6 - ipdb> print(lst[len(lst)-1]) - r - ipdb> quit - - In [3]: - -.. topic:: Depuración post-mortem sin ipython - - En algunas situaciones no podrás usar IPython, por ejemplo para depurar - un `script` que ha sido llamado desde la línea de comandos. En este caso, - puedes ejecutar el `script` de la siguiente forma - :command:`python3 -m pdb script.py`: - - .. sourcecode:: console - - python3 -m pdb index_error.py - - Este comando anterior muestra lo siguiente: - - :: - - > /home/macagua/python/entrenamiento/index_error.py(1)() - -> """Small snippet to raise an IndexError.""" - (Pdb) continue - Traceback (most recent call last): - File "/usr/lib/python3.11/pdb.py", line 1296, in main - pdb._runscript(mainpyfile) - File "/usr/lib/python3.11/pdb.py", line 1215, in _runscript - self.run(statement) - File "/usr/lib/python3.11/bdb.py", line 372, in run - exec cmd in globals, locals - File "", line 1, in - File "index_error.py", line 8, in - index_error() - File "index_error.py", line 5, in index_error - print(lst[len(lst)]) - IndexError: list index out of range - Uncaught exception. Entering post mortem debugging - Running 'cont' or 'step' will restart the program - > /home/macagua/python/entrenamiento/index_error.py(5)index_error() - -> print(lst[len(lst)]) - (Pdb) - - -Ejecución paso a paso -~~~~~~~~~~~~~~~~~~~~~ - -**Situación**: Crees que existe un error en un módulo pero no estás seguro donde. - -Por ejemplo, esta intentado depurar :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`. -A pesar de que el código se ejecuta, observa que el filtrado no se -está haciendo correctamente. - -* Ejecuta el `script` en IPython con el depurador usando :command:`%run -d wiener_filtering.py`: - - .. code-block:: pycon - - In [1]: %run -d wiener_filtering.py - *** Blank or comment - *** Blank or comment - *** Blank or comment - Breakpoint 1 at /home/macagua/python/entrenamiento/wiener_filtering.py:4 - NOTE: Enter 'c' at the ipdb> prompt to start your script. - > (1)() - -* Coloca un *breakpoint* en la línea 34 usando ``b 34``: - - .. code-block:: pycon - - ipdb> n - > /home/macagua/python/entrenamiento/wiener_filtering.py(4)() - 3 - 1---> 4 import numpy as np - 5 import scipy as sp - - ipdb> b 34 - Breakpoint 2 at /home/macagua/python/entrenamiento/wiener_filtering.py:34 - -* Continua la ejecución hasta el siguiente `breakpoint` con ``c(ont(inue))``: - - .. code-block:: pycon - - ipdb> c - > /home/macagua/python/entrenamiento/wiener_filtering.py(34)iterated_wiener() - 33 """ - 2--> 34 noisy_img = noisy_img - 35 denoised_img = local_mean(noisy_img, size=size) - -* Da pasos hacia adelante y detrás del código con ``n(ext)`` y - ``s(tep)``. ``next`` salta hasta la siguiente declaración en el actual - contexto de ejecución mientras que ``step`` se moverá entre los contextos - en ejecución, i.e. permitiendo explorar dentro de llamadas a funciones: - - .. code-block:: pycon - - ipdb> s - > /home/macagua/python/entrenamiento/wiener_filtering.py(35)iterated_wiener() - 2 34 noisy_img = noisy_img - ---> 35 denoised_img = local_mean(noisy_img, size=size) - 36 l_var = local_var(noisy_img, size=size) - - ipdb> n - > /home/macagua/python/entrenamiento/wiener_filtering.py(36)iterated_wiener() - 35 denoised_img = local_mean(noisy_img, size=size) - ---> 36 l_var = local_var(noisy_img, size=size) - 37 for i in range(3): - - -* Muévete unas pocas líneas y explora las variables locales: - - .. code-block:: pycon - - ipdb> n - > /home/macagua/python/entrenamiento/wiener_filtering.py(37)iterated_wiener() - 36 l_var = local_var(noisy_img, size=size) - ---> 37 for i in range(3): - 38 res = noisy_img - denoised_img - ipdb> print(l_var) - [[5868 5379 5316 ..., 5071 4799 5149] - [5013 363 437 ..., 346 262 4355] - [5379 410 344 ..., 392 604 3377] - ..., - [ 435 362 308 ..., 275 198 1632] - [ 548 392 290 ..., 248 263 1653] - [ 466 789 736 ..., 1835 1725 1940]] - ipdb> print(l_var.min()) - 0 - -*Oh dear*, solo ve entero y variación 0. Aquí está nuestro error, -estamos haciendo aritmética con enteros. - -.. topic:: Lanzando excepciones en errores numéricos - - Cuando ejecuta el archivo :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`, - se lanzarán los siguientes avisos: - - .. code-block:: pycon - - In [2]: %run wiener_filtering.py - wiener_filtering.py:40: RuntimeWarning: divide by zero encountered in divide - noise_level = (1 - noise/l_var ) - - Puede convertir estos avisos a excepciones, lo que le permitiría - hacer una depuración post-mortem sobre ellos y encontrar el problema - de manera más rápida: - - .. code-block:: pycon - - In [3]: np.seterr(all='raise') - Out[3]: {'divide': 'print', 'invalid': 'print', 'over': 'print', 'under': 'ignore'} - In [4]: %run wiener_filtering.py - --------------------------------------------------------------------------- - FloatingPointError Traceback (most recent call last) - /home/macagua/venv/lib/python3.11/site-packages/IPython/utils/py3compat.pyc - in execfile(fname, *where) - 176 else: - 177 filename = fname - --> 178 __builtin__.execfile(filename, *where) - - /home/macagua/python/entrenamiento/wiener_filtering.py in () - 55 pl.matshow(noisy_lena[cut], cmap=pl.cm.gray) - 56 - ---> 57 denoised_lena = iterated_wiener(noisy_lena) - 58 pl.matshow(denoised_lena[cut], cmap=pl.cm.gray) - 59 - - /home/macagua/python/entrenamiento/wiener_filtering.py in - iterated_wiener(noisy_img, size) - 38 res = noisy_img - denoised_img - 39 noise = (res**2).sum()/res.size - ---> 40 noise_level = (1 - noise/l_var ) - 41 noise_level[noise_level<0] = 0 - 42 denoised_img += noise_level*res - FloatingPointError: divide by zero encountered in divide - - -Otras formas de comenzar una depuración -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -* **Lanzar una excepción "break point" a lo pobre** - - Si encuentras tedioso el tener que anotar el número de línea para colocar - un *break point*, puedes lanzar una excepción en el punto que quieres - inspeccionar y usar la 'magia' ``%debug`` del interprete :ref:`ipython `. Destacar que en este - caso no puedes moverte por el código y continuar después la ejecución. - -* **Depurando fallos de pruebas usando nosetests** - - Puede ejecutar ``nosetests --pdb`` para saltar a la depuración - post-mortem de excepciones y ``nosetests --pdb-failure`` para inspeccionar - los fallos de pruebas usando el depurador. - - Además, puedes usar la interfaz IPython para el depurador en **nose** - usando el plugin de **nose** - `ipdbplugin `_. Puede, entonces, - pasar las opciones ``--ipdb`` y ``--ipdb-failure`` a los *nosetests*. - -* **Llamando explícitamente al depurador** - - Inserta la siguiente línea donde quieres que salte el depurador: - - .. code-block:: python - :linenos: - - import pdb - - pdb.set_trace() - - -.. warning:: - - Cuando se ejecutan ``nosetests``, se captura la salida y parecerá - que el depurador no está funcionando. Para evitar esto simplemente ejecuta - los ``nosetests`` con la etiqueta ``-s``. - - -.. topic:: Depuradores gráficos y alternativas - - * Quizá encuentres más conveniente usar un depurador gráfico como - `winpdb `_. para inspeccionar saltas a través del - código e inspeccionar las variables - - * De forma alternativa, `pudb `_ es un - buen depurador semi-gráfico con una interfaz de texto en la consola. - - * También, estaría bien echarle un ojo al proyecto - `pydbgr `_ - -Comandos del depurador e interacciones -...................................... - -============ ====================================================================== -``l(list)`` Lista el código en la posición actual -``u(p)`` Paso arriba de la llamada a la pila (*call stack*) -``d(own)`` Paso abajo de la llamada a la pila ((*call stack*) -``n(ext)`` Ejecuta la siguiente línea (no va hacia abajo en funciones nuevas) -``s(tep)`` Ejecuta la siguiente declaración (va hacia abajo en las nuevas funciones) -``bt`` Muestra el *call stack* -``a`` Muestra las variables locales -``!command`` Ejecuta el comando **Python** proporcionado (en oposición a comandos pdb) -============ ====================================================================== - -.. warning:: **Los comandos de depuración no son código Python** - - No puedes nombrar a las variables de la forma que quieras. Por ejemplo, - si esta dentro del depurador no podrá sobrescribir a las variables con el - mismo y, por tanto, **habrá que usar diferentes nombres para las - variables cuando este tecleando código en el depurador**. - -Obteniendo ayuda dentro del depurador -..................................... - -Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: - -.. sourcecode:: pycon - - ipdb> help - - Documented commands (type help ): - ======================================== - EOF bt cont enable jump pdef r tbreak w - a c continue exit l pdoc restart u whatis - alias cl d h list pinfo return unalias where - args clear debug help n pp run unt - b commands disable ignore next q s until - break condition down j p quit step up - - Miscellaneous help topics: - ========================== - exec pdb - - Undocumented commands: - ====================== - retval rv - - ----- - - -.. important:: - Usted puede descargar el código usado en esta sección haciendo clic en los - siguientes enlaces: - - - :download:`index_error.py <../../recursos/leccion6/index_error.py>`. - - - :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`. - - Adicional se incluye otro código de ejemplo muy simple - :download:`funcion_a_depurar.py <../../recursos/leccion6/funcion_a_depurar.py>` - usando la función ``set_trace()`` del módulo ``pdb``. - - -.. tip:: - Para ejecutar el código :file:`index_error.py`, :file:`wiener_filtering.py` - y :file:`funcion_a_depurar.py`, abra una consola de comando, acceda al directorio - donde se encuentra ambos programas: - - :: - - leccion6/ - ├── index_error.py - ├── wiener_filtering.py - └── funcion_a_depurar.py - - Si tiene la estructura de archivo previa, entonces ejecute por separado cada comando: - - .. code-block:: console - - python3 index_error.py - - .. code-block:: console - - python3 wiener_filtering.py - - .. code-block:: console - - python3 funcion_a_depurar.py - - ----- - - -.. seealso:: - - Consulte la sección de :ref:`lecturas suplementarias ` - del entrenamiento para ampliar su conocimiento en esta temática. - - ----- - - -.. raw:: html - :file: ../_templates/partials/soporte_profesional.html - -.. - .. disqus:: diff --git a/source/leccion6/index.rst b/source/leccion6/index.rst index 809427b..ec1f95e 100644 --- a/source/leccion6/index.rst +++ b/source/leccion6/index.rst @@ -1,9 +1,10 @@ .. _python_leccion6: -Introspección a la depuración con pdb -===================================== +Introspección a la depuración de software +========================================= -En Python puede realizar depuración de programas por defecto usando el módulo ``pdb``. +En Python puede realizar de depuración de software usando usando el módulo :ref:`pdb ` +incluida en la :ref:`librería estándar ` Python. En esta lección se describen como hacer depuración a programas en el lenguaje Python, mostrando ejemplos prácticos y útiles. @@ -13,7 +14,8 @@ A continuación el temario de esta lección: .. toctree:: :maxdepth: 2 - depuracion + pdb + ipdb ---- diff --git a/source/leccion6/ipdb.rst b/source/leccion6/ipdb.rst new file mode 100644 index 0000000..26d6718 --- /dev/null +++ b/source/leccion6/ipdb.rst @@ -0,0 +1,503 @@ +.. _python_modulo_ipdb: + +Módulo ipdb +----------- + +Depurando interactivamente en la consola + +El módulo `ipdb `_ exporta funciones para acceder al :ref:`IPython `, +que cuenta con completado de tabulación, resaltado de sintaxis, mejores trazas, mejor introspección con la misma interfaz +que el módulo :ref:`pdb ` para depurar tu código fuente de forma interactiva. + +Para instalar este paquete ``ipdb`` use la herramienta :ref:`pip ` +ejecutando el siguiente comando, el cual a continuación se presentan el correspondiente +comando de tu sistema operativo: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + pip3 install ipdb + + .. group-tab:: Windows + + .. code-block:: console + + pip3 install ipdb + +Puede probar si la instalación se realizo correctamente, ejecutando el siguiente +comando correspondiente a tu sistema operativo: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + python3 -c "import ipdb ; print(ipdb.__package__)" + + .. group-tab:: Windows + + .. code-block:: console + + python3 -c "import ipdb ; print(ipdb.__package__)" + +Si muestra el nombre del paquete ``ipdb`` en la terminal, tiene correctamente +instalada la módulo. Con esto, ya tiene todo listo para continuar. + + +Invocando al depurador +...................... + +Formas de lanzar el depurador: + +#. Postmortem, lanza el depurador después de que se hayan producido + errores. + +#. Lanza el módulo con el depurador. + +#. Lanza al depurador desde dentro del módulo. + + +Postmortem +~~~~~~~~~~ + +**Situación**: Estás trabajando en el interprete :ref:`IPython ` +y obtienes un error (:ref:`traceback `). + +En este caso esta depurando el módulo :download:`index_error.py <../../recursos/leccion6/index_error.py>`. + +Entonces ejecute el interprete :ref:`IPython `, con el siguiente comando: + +.. code-block:: console + + ipython + +Al entrar al interprete :ref:`IPython `, escribe :command:`%run index_error.py` + +.. code-block:: pycon + + In [1]: %run index_error.py + --------------------------------------------------------------------------- + IndexError Traceback (most recent call last) + File /home/macagua/python/entrenamiento/index_error.py:10 + 6 print(lst[len(lst)]) + 9 if __name__ == "__main__": + ---> 10 index_error() + + File /home/macagua/python/entrenamiento/index_error.py:6, in index_error() + 4 def index_error(): + 5 lst = list("foobar") + ----> 6 print(lst[len(lst)]) + + IndexError: list index out of range + +Cuando lo ejecutes verás como se lanza una excepción :ref:`IndexError `. +Entonces ejecute el comando :command:`%debug` y entrarás en el depurador. + +.. code-block:: pycon + + In [2]: %debug + > /home/macagua/python/entrenamiento/index_error.py(6)index_error() + 4 def index_error(): + 5 lst = list("foobar") + ----> 6 print(lst[len(lst)]) + 7 + 8 + + ipdb> list + 1 """Small snippet to raise an IndexError.""" + 2 + 3 + 4 def index_error(): + 5 lst = list("foobar") + ----> 6 print(lst[len(lst)]) + 7 + 8 + 9 if __name__ == "__main__": + 10 index_error() + + ipdb> len(lst) + 6 + ipdb> print(lst[len(lst)-1]) + r + ipdb> quit + + In [3]: + +.. topic:: Depuración post-mortem sin IPython + + En algunas situaciones no podrás usar :ref:`IPython `, por ejemplo + para depurar un `script` que ha sido llamado desde la línea de comandos. En este caso, + puedes ejecutar el `script` de la siguiente forma :command:`python3 -m ipdb script.py`: + + .. sourcecode:: console + + python3 -m ipdb index_error.py + + Este comando anterior muestra lo siguiente: + + .. code-block:: pycon + + > /home/macagua/python/entrenamiento/index_error.py(1)() + ----> 1 """Small snippet to raise an IndexError.""" + 2 + 3 + + ipdb> continue + Traceback (most recent call last): + File "/usr/lib/python3.11/ipdb/__main__.py", line 318, in main + pdb._run(stdlib_pdb._ScriptTarget(mainpyfile)) + File "/usr/lib/python3.11/pdb.py", line 1652, in _run + self.run(target.code) + File "/usr/lib/python3.11/bdb.py", line 597, in run + exec(cmd, globals, locals) + File "", line 1, in + File "/home/macagua/python/entrenamiento/index_error.py", line 10, in + index_error() + File "/home/macagua/python/entrenamiento/index_error.py", line 6, in index_error + print(lst[len(lst)]) + ~~~^^^^^^^^^^ + IndexError: list index out of range + Uncaught exception. Entering post mortem debugging + Running 'cont' or 'step' will restart the program + > /home/macagua/python/entrenamiento/index_error.py(6)index_error() + 5 lst = list("foobar") + ----> 6 print(lst[len(lst)]) + 7 + + ipdb> + +De esta forma, puedes ejecutar postmortem la depuración del código del módulo. + + +Ejecución paso a paso +~~~~~~~~~~~~~~~~~~~~~ + +**Situación**: Crees que existe un error en un módulo pero no estás seguro donde. + +Por ejemplo, esta intentado depurar :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`. +A pesar de que el código se ejecuta, observa que el filtrado no se +está haciendo correctamente. + +* Ejecuta el `script` en :ref:`IPython ` con el depurador usando :command:`%run -d wiener_filtering.py`: + + .. code-block:: pycon + + In [1]: %run -d wiener_filtering.py + *** Blank or comment + *** Blank or comment + *** Blank or comment + NOTE: Enter 'c' at the ipdb> prompt to continue execution. + > /home/macagua/python/entrenamiento/wiener_filtering.py(1)() + ----> 1 """Wiener filtering a noisy Lena: this module is buggy""" + 2 + 3 import numpy as np + 4 import scipy as sp + 5 import pylab as pl + + +* Coloca un ``breakpoint`` en la línea 34 usando ``b 34``: + + .. code-block:: pycon + + ipdb> n + > /home/macagua/python/entrenamiento/wiener_filtering.py(3)() + 1 """Wiener filtering a noisy Lena: this module is buggy""" + 2 + ----> 3 import numpy as np + 4 import scipy as sp + 5 import pylab as pl + + ipdb> b 34 + Breakpoint 1 at /home/macagua/python/entrenamiento/wiener_filtering.py:34 + +* Continua la ejecución hasta el siguiente ``breakpoint`` con ``c(ont(inue))``: + + .. code-block:: pycon + + ipdb> c + > /home/macagua/python/entrenamiento/wiener_filtering.py(34)iterated_wiener() + 33 """ + 2--> 34 noisy_img = noisy_img + 35 denoised_img = local_mean(noisy_img, size=size) + +* Da pasos hacia adelante y detrás del código con ``n(ext)`` y + ``s(tep)``. ``next`` salta hasta la siguiente declaración en el actual + contexto de ejecución mientras que ``step`` se moverá entre los contextos + en ejecución, i.e. permitiendo explorar dentro de llamadas a funciones: + + .. code-block:: pycon + + ipdb> s + > /home/macagua/python/entrenamiento/wiener_filtering.py(35)iterated_wiener() + 2 34 noisy_img = noisy_img + ---> 35 denoised_img = local_mean(noisy_img, size=size) + 36 l_var = local_var(noisy_img, size=size) + + ipdb> n + > /home/macagua/python/entrenamiento/wiener_filtering.py(36)iterated_wiener() + 35 denoised_img = local_mean(noisy_img, size=size) + ---> 36 l_var = local_var(noisy_img, size=size) + 37 for i in range(3): + + +* Muévete unas pocas líneas y explora las variables locales: + + .. code-block:: pycon + + ipdb> n + > /home/macagua/python/entrenamiento/wiener_filtering.py(37)iterated_wiener() + 36 l_var = local_var(noisy_img, size=size) + ---> 37 for i in range(3): + 38 res = noisy_img - denoised_img + ipdb> print(l_var) + [[5868 5379 5316 ..., 5071 4799 5149] + [5013 363 437 ..., 346 262 4355] + [5379 410 344 ..., 392 604 3377] + ..., + [ 435 362 308 ..., 275 198 1632] + [ 548 392 290 ..., 248 263 1653] + [ 466 789 736 ..., 1835 1725 1940]] + ipdb> print(l_var.min()) + 0 + +*Oh estimado(a)*, solo ve entero y variación 0. Aquí está nuestro error, +estamos haciendo aritmética con enteros. + +.. topic:: Lanzando excepciones en errores numéricos + + Cuando ejecuta el archivo :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`, + se lanzarán los siguientes avisos: + + .. code-block:: pycon + :class: no-copy + + In [2]: %run wiener_filtering.py + wiener_filtering.py:40: RuntimeWarning: divide by zero encountered in divide + noise_level = (1 - noise/l_var ) + + Puede convertir estos avisos a excepciones, lo que le permitiría + hacer una depuración post-mortem sobre ellos y encontrar el problema + de manera más rápida: + + .. code-block:: pycon + :class: no-copy + + In [3]: np.seterr(all='raise') + Out[3]: {'divide': 'print', 'invalid': 'print', 'over': 'print', 'under': 'ignore'} + In [4]: %run wiener_filtering.py + --------------------------------------------------------------------------- + FloatingPointError Traceback (most recent call last) + /home/macagua/venv/lib/python3.11/site-packages/IPython/utils/py3compat.pyc + in execfile(fname, *where) + 176 else: + 177 filename = fname + --> 178 __builtin__.execfile(filename, *where) + + /home/macagua/python/entrenamiento/wiener_filtering.py in () + 55 pl.matshow(noisy_lena[cut], cmap=pl.cm.gray) + 56 + ---> 57 denoised_lena = iterated_wiener(noisy_lena) + 58 pl.matshow(denoised_lena[cut], cmap=pl.cm.gray) + 59 + + /home/macagua/python/entrenamiento/wiener_filtering.py in + iterated_wiener(noisy_img, size) + 38 res = noisy_img - denoised_img + 39 noise = (res**2).sum()/res.size + ---> 40 noise_level = (1 - noise/l_var ) + 41 noise_level[noise_level<0] = 0 + 42 denoised_img += noise_level*res + FloatingPointError: divide by zero encountered in divide + +De esta forma, puedes ejecutar paso a paso la depuración del código del módulo. + + +Lanza al depurador desde adentro +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Puedes llamar explícitamente al depurador desde adentro. Inserta la siguiente línea +donde quieres que salte el depurador: + +.. code-block:: python + :linenos: + + import ipdb + + ipdb.set_trace() + +A continuación, se muestra un ejemplo del uso de la función ``set_trace()``: + +.. literalinclude:: ../../recursos/leccion6/funcion_ipdb.py + :language: python + :linenos: + :lines: 1-13 + +.. tip:: + Para ejecutar el código fuente de esta práctica debe invocar al módulo :file:`funcion_ipdb.py`, + abra una consola de comando, acceda al directorio donde se encuentra el módulo :file:`funcion_ipdb.py` + y ejecute el siguiente comando: + +.. code-block:: console + + python3 funcion_ipdb.py + +El anterior código al ejecutar debe mostrar el siguiente mensaje: + +.. code-block:: console + :class: no-copy + + > /home/macagua/python/entrenamiento/funcion_ipdb.py(6)calculo() + 5 ipdb.set_trace() + ----> 6 if args[0]: + 7 print(args[0]) + + ipdb> c + 12 + 14522590 + + +De esta forma, puedes depurar el código de la función ``calculo`` desde adentro del módulo. + + +Formas alternativas para depurar +................................ + +Existen otras formas de comenzar una depuración, a continuación se describen: + +* **Lanzar una excepción "break point" a lo pobre** + + Si encuentras tedioso el tener que anotar el número de línea para colocar + un *break point*, puedes lanzar una excepción en el punto que quieres + inspeccionar y usar la *'magia'* ``%debug`` del interprete :ref:`IPython `. + Destacar que en este caso no puedes moverte por el código y continuar después la ejecución. + + +.. _python_modulo_ipdb_comandos: + +Comandos del depurador interactivo +.................................. + +A continuación se muestra una tabla con los comandos más comunes +de depuración y sus descripciones: + +.. tip:: + Consulte los :ref:`comandos del pdb `. + +============================= ====================================================================== +``exceptions`` Listar o modificar la excepción actual en una cadena de excepciones +``pdef`` Imprime la firma de llamada de cualquier objeto invocable. +``pdoc`` Imprime la cadena de documentación de un objeto. +``pfile`` Imprime el archivo donde se define un objeto. +``pinfo`` Proporciona información detallada sobre un objeto. +``pinfo2`` Proporciona información extra detallada sobre un objeto. +``psource`` Imprime el código fuente de un objeto. +``retval``, ``rv`` Imprime el valor de retorno de la última función llamada. +``s(tep)`` Ejecuta la línea actual, deteniéndose en la primera ocasión posible. +``skip_hidden`` Cambia si se deben omitir o no los marcos con el atributo ``__tracebackhide__``. +``skip_predicates`` La opción global de omitir (o no) los fotogramas ocultos se establece con ``skip_hidden`` +============================= ====================================================================== + +.. warning:: **Los comandos de depuración no son código Python** + + No puedes nombrar a las variables de la forma que quieras. Por ejemplo, + si esta dentro del depurador no podrá sobrescribir a las variables con el + mismo y, por tanto, **habrá que usar diferentes nombres para las + variables cuando este tecleando código en el depurador**. + + +.. _python_modulo_ipdb_ayuda: + +Ayuda del depurador interactivo +............................... + +Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: + +.. sourcecode:: pycon + + ipdb> help + + Documented commands (type help ): + ======================================== + EOF commands enable ll pp s until + a condition exceptions longlist psource skip_hidden up + alias cont exit n q skip_predicates w + args context h next quit source whatis + b continue help p r step where + break d ignore pdef restart tbreak + bt debug j pdoc return u + c disable jump pfile retval unalias + cl display l pinfo run undisplay + clear down list pinfo2 rv unt + + Miscellaneous help topics: + ========================== + exec pdb + + Undocumented commands: + ====================== + interact + + +---- + + +.. important:: + Usted puede descargar el código usado en esta sección haciendo clic en los + siguientes enlaces: + + - :download:`funcion_ipdb.py <../../recursos/leccion6/funcion_ipdb.py>`. + + - :download:`index_error.py <../../recursos/leccion6/index_error.py>`. + + - :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`. + + +.. tip:: + Para ejecutar el código :file:`funcion_ipdb.py`, :file:`index_error.py` + y :file:`wiener_filtering.py`, abra una consola de comando, acceda al directorio + donde se encuentra ambos programas: + + .. code-block:: console + :class: no-copy + + depuracion/ + ├── funcion_ipdb.py + ├── index_error.py + └── wiener_filtering.py + + Si tiene la estructura de archivo previa, entonces ejecute por separado cada comando: + + .. code-block:: console + + python3 funcion_ipdb.py + + .. code-block:: console + + ipdb3 index_error.py + + .. code-block:: console + + python3 -m ipdb wiener_filtering.py + + +---- + + +.. seealso:: + + Consulte la sección de :ref:`lecturas suplementarias ` + del entrenamiento para ampliar su conocimiento en esta temática. + + +---- + + +.. raw:: html + :file: ../_templates/partials/soporte_profesional.html + +.. + .. disqus:: diff --git a/source/leccion6/pdb.rst b/source/leccion6/pdb.rst new file mode 100644 index 0000000..90ecb68 --- /dev/null +++ b/source/leccion6/pdb.rst @@ -0,0 +1,513 @@ +.. _python_modulo_pdb: + +Módulo pdb +---------- + +En este tutorial se exploran herramientas que ayudan a entender tu +código: depuración para encontrar y corregir *bugs* (errores). + +El depurador Python, :mod:`pdb`, te permite inspeccionar tu código +de forma interactiva. + +Te permite: + +- Ver el código fuente. + +- Ir hacia arriba y hacia abajo del punto donde se ha producido + un error. + +- Inspeccionar valores de variables. + +- Modificar valores de variables. + +- Establecer ``breakpoints`` (punto de parada del proceso). + +.. topic:: **print** + + Sí, las declaraciones :ref:`print ` sirven como herramienta de depuración. + Sin embargo, para inspeccionar en tiempo de ejecución es más + eficiente usar el depurador. + + +Invocando al depurador +...................... + +Formas de lanzar el depurador: + +#. Postmortem, lanza el depurador después de que se hayan producido + errores. + +#. Lanza el módulo con el depurador. + +#. Llama al depurador desde dentro del módulo. + + +Postmortem +~~~~~~~~~~ + +**Situación**: Estás trabajando en el interprete :ref:`IPython ` +y obtienes un error (:ref:`traceback `). + +En este caso esta depurando el módulo :download:`index_error.py <../../recursos/leccion6/index_error.py>`. + +Entonces ejecute el interprete :ref:`IPython `, con el siguiente comando: + +.. code-block:: console + + ipython + +Al entrar al interprete :ref:`IPython `, escribe :command:`%run index_error.py` + +.. code-block:: pycon + + In [1]: %run index_error.py + --------------------------------------------------------------------------- + IndexError Traceback (most recent call last) + File /home/macagua/python/entrenamiento/index_error.py:10 + 6 print(lst[len(lst)]) + 9 if __name__ == "__main__": + ---> 10 index_error() + + File /home/macagua/python/entrenamiento/index_error.py:6, in index_error() + 4 def index_error(): + 5 lst = list("foobar") + ----> 6 print(lst[len(lst)]) + + IndexError: list index out of range + +Cuando lo ejecutes verás como se lanza una excepción :ref:`IndexError `. +Entonces ejecute el comando :command:`%debug` y entrarás en el depurador. + +.. code-block:: pycon + + In [2]: %debug + > /home/macagua/python/entrenamiento/index_error.py(6)index_error() + 4 def index_error(): + 5 lst = list("foobar") + ----> 6 print(lst[len(lst)]) + 7 + 8 + + ipdb> list + 1 """Small snippet to raise an IndexError.""" + 2 + 3 + 4 def index_error(): + 5 lst = list("foobar") + ----> 6 print(lst[len(lst)]) + 7 + 8 + 9 if __name__ == "__main__": + 10 index_error() + + ipdb> len(lst) + 6 + ipdb> print(lst[len(lst)-1]) + r + ipdb> quit + + In [3]: + +.. topic:: Depuración post-mortem sin IPython + + En algunas situaciones no podrás usar :ref:`IPython `, por ejemplo + para depurar un `script` que ha sido llamado desde la línea de comandos. En este caso, + puedes ejecutar el `script` de la siguiente forma :command:`python3 -m pdb script.py`: + + .. sourcecode:: console + + python3 -m pdb index_error.py + + Este comando anterior muestra lo siguiente: + + .. code-block:: pycon + + > /home/macagua/python/entrenamiento/index_error.py(1)() + -> """Small snippet to raise an IndexError.""" + (Pdb) continue + Traceback (most recent call last): + File "/usr/lib/python3.11/pdb.py", line 1774, in main + pdb._run(target) + File "/usr/lib/python3.11/pdb.py", line 1652, in _run + self.run(target.code) + File "/usr/lib/python3.11/bdb.py", line 597, in run + exec(cmd, globals, locals) + File "", line 1, in + File "/home/macagua/python/entrenamiento/index_error.py", line 10, in + index_error() + File "/home/macagua/python/entrenamiento/index_error.py", line 6, in index_error + print(lst[len(lst)]) + ~~~^^^^^^^^^^ + IndexError: list index out of range + Uncaught exception. Entering post mortem debugging + Running 'cont' or 'step' will restart the program + > /home/macagua/python/entrenamiento/index_error.py(6)index_error() + -> print(lst[len(lst)]) + (Pdb) + +De esta forma, puedes ejecutar postmortem la depuración del código del módulo. + + +Ejecución paso a paso +~~~~~~~~~~~~~~~~~~~~~ + +**Situación**: Crees que existe un error en un módulo pero no estás seguro donde. + +Por ejemplo, esta intentado depurar :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`. +A pesar de que el código se ejecuta, observa que el filtrado no se +está haciendo correctamente. + +* Ejecuta el `script` en :ref:`IPython ` con el depurador usando :command:`%run -d wiener_filtering.py`: + + .. code-block:: pycon + + In [1]: %run -d wiener_filtering.py + *** Blank or comment + *** Blank or comment + *** Blank or comment + Breakpoint 1 at /home/macagua/python/entrenamiento/wiener_filtering.py:4 + NOTE: Enter 'c' at the ipdb> prompt to start your script. + > (1)() + +* Coloca un ``breakpoint`` en la línea 34 usando ``b 34``: + + .. code-block:: pycon + + ipdb> n + > /home/macagua/python/entrenamiento/wiener_filtering.py(4)() + 3 + 1---> 4 import numpy as np + 5 import scipy as sp + + ipdb> b 34 + Breakpoint 2 at /home/macagua/python/entrenamiento/wiener_filtering.py:34 + +* Continua la ejecución hasta el siguiente ``breakpoint`` con ``c(ont(inue))``: + + .. code-block:: pycon + + ipdb> c + > /home/macagua/python/entrenamiento/wiener_filtering.py(34)iterated_wiener() + 33 """ + 2--> 34 noisy_img = noisy_img + 35 denoised_img = local_mean(noisy_img, size=size) + +* Da pasos hacia adelante y detrás del código con ``n(ext)`` y + ``s(tep)``. ``next`` salta hasta la siguiente declaración en el actual + contexto de ejecución mientras que ``step`` se moverá entre los contextos + en ejecución, i.e. permitiendo explorar dentro de llamadas a funciones: + + .. code-block:: pycon + + ipdb> s + > /home/macagua/python/entrenamiento/wiener_filtering.py(35)iterated_wiener() + 2 34 noisy_img = noisy_img + ---> 35 denoised_img = local_mean(noisy_img, size=size) + 36 l_var = local_var(noisy_img, size=size) + + ipdb> n + > /home/macagua/python/entrenamiento/wiener_filtering.py(36)iterated_wiener() + 35 denoised_img = local_mean(noisy_img, size=size) + ---> 36 l_var = local_var(noisy_img, size=size) + 37 for i in range(3): + + +* Muévete unas pocas líneas y explora las variables locales: + + .. code-block:: pycon + + ipdb> n + > /home/macagua/python/entrenamiento/wiener_filtering.py(37)iterated_wiener() + 36 l_var = local_var(noisy_img, size=size) + ---> 37 for i in range(3): + 38 res = noisy_img - denoised_img + ipdb> print(l_var) + [[5868 5379 5316 ..., 5071 4799 5149] + [5013 363 437 ..., 346 262 4355] + [5379 410 344 ..., 392 604 3377] + ..., + [ 435 362 308 ..., 275 198 1632] + [ 548 392 290 ..., 248 263 1653] + [ 466 789 736 ..., 1835 1725 1940]] + ipdb> print(l_var.min()) + 0 + +*Oh estimado(a)*, solo ve entero y variación 0. Aquí está nuestro error, +estamos haciendo aritmética con enteros. + +.. topic:: Lanzando excepciones en errores numéricos + + Cuando ejecuta el archivo :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`, + se lanzarán los siguientes avisos: + + .. code-block:: pycon + :class: no-copy + + In [2]: %run wiener_filtering.py + wiener_filtering.py:40: RuntimeWarning: divide by zero encountered in divide + noise_level = (1 - noise/l_var ) + + Puede convertir estos avisos a excepciones, lo que le permitiría + hacer una depuración post-mortem sobre ellos y encontrar el problema + de manera más rápida: + + .. code-block:: pycon + :class: no-copy + + In [3]: np.seterr(all='raise') + Out[3]: {'divide': 'print', 'invalid': 'print', 'over': 'print', 'under': 'ignore'} + In [4]: %run wiener_filtering.py + --------------------------------------------------------------------------- + FloatingPointError Traceback (most recent call last) + /home/macagua/venv/lib/python3.11/site-packages/IPython/utils/py3compat.pyc + in execfile(fname, *where) + 176 else: + 177 filename = fname + --> 178 __builtin__.execfile(filename, *where) + + /home/macagua/python/entrenamiento/wiener_filtering.py in () + 55 pl.matshow(noisy_lena[cut], cmap=pl.cm.gray) + 56 + ---> 57 denoised_lena = iterated_wiener(noisy_lena) + 58 pl.matshow(denoised_lena[cut], cmap=pl.cm.gray) + 59 + + /home/macagua/python/entrenamiento/wiener_filtering.py in + iterated_wiener(noisy_img, size) + 38 res = noisy_img - denoised_img + 39 noise = (res**2).sum()/res.size + ---> 40 noise_level = (1 - noise/l_var ) + 41 noise_level[noise_level<0] = 0 + 42 denoised_img += noise_level*res + FloatingPointError: divide by zero encountered in divide + +De esta forma, puedes ejecutar paso a paso la depuración del código del módulo. + + +Lanza al depurador desde adentro +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Puedes llamar explícitamente al depurador desde adentro. Inserta la siguiente línea +donde quieres que salte el depurador: + +.. code-block:: python + :linenos: + + import pdb + + pdb.set_trace() + +A continuación, se muestra un ejemplo del uso de la función ``set_trace()``: + +.. literalinclude:: ../../recursos/leccion6/funcion_a_depurar.py + :language: python + :linenos: + :lines: 1-13 + +.. tip:: + Para ejecutar el código fuente de esta práctica debe invocar al módulo :file:`funcion_a_depurar.py`, + abra una consola de comando, acceda al directorio donde se encuentra el módulo :file:`funcion_a_depurar.py` + y ejecute el siguiente comando: + +.. code-block:: console + + python3 funcion_a_depurar.py + +El anterior código al ejecutar debe mostrar el siguiente mensaje: + +.. code-block:: console + :class: no-copy + + > /home/macagua/python/entrenamiento/funcion_a_depurar.py(6)calculo() + -> if args[0]: + (Pdb) c + 12 + 14522590 + + +De esta forma, puedes depurar el código de la función ``calculo`` desde adentro del módulo. + + +Formas alternativas para depurar +................................ + +Existen otras formas de comenzar una depuración, a continuación se describen: + +* **Lanzar una excepción "break point" a lo pobre** + + Si encuentras tedioso el tener que anotar el número de línea para colocar + un *break point*, puedes lanzar una excepción en el punto que quieres + inspeccionar y usar la *'magia'* ``%debug`` del interprete :ref:`IPython `. + Destacar que en este caso no puedes moverte por el código y continuar después la ejecución. + +* **Depurando fallos de pruebas usando pytest** + + Puede ejecutar pruebas usando `pytest `_ con el comando + :command:`pytest --pdb` este invocará al depurador de Python en cada fallo (o una excepción + :ref:`KeyboardInterrupt ` se dispara al momento que + el programador presiona el comando :keys:`Ctrl+C` o :keys:`Ctrl+Z` en su teclado, cuando está + presente en una línea de comandos (en Windows) o en una terminal(en iOS/Linux)). Ademas con el + comando :command:`pytest --trace` puedes permite entrar en el prompt :ref:`pdb ` + inmediatamente al inicio de cada prueba. + +* **Depurando interactivamente en la consola** + + Consulte el módulo :ref:`ipdb `. + + +.. topic:: Depuradores gráficos y alternativas + + * Quizá encuentres más conveniente usar un depurador gráfico como + `winpdb `_. para inspeccionar saltas a través del + código e inspeccionar las variables + + * De forma alternativa, `pudb `_ es un + buen depurador semi-gráfico con una interfaz de texto en la consola. + + +.. _python_modulo_pdb_comandos: + +Comandos del depurador +...................... + +A continuación se muestra una tabla con los comandos más comunes +de depuración y sus descripciones: + +============================= ====================================================================== +``EOF`` Maneja la recepción de EOF como un comando +``alias `` Crea un alias para el comando +``a``, ``args`` Imprime la lista de argumentos de la función actual +``b``, ``break`` Establece un *breakpoint* en la línea actual +``bt`` Muestra el *call stack* +``cl``, ``clear`` Limpia todos los *breakpoints* +``cl `` Limpia el *breakpoint* número ``n`` +``!command`` Ejecuta el comando **Python** proporcionado (en oposición a comandos ``pdb``) +``commands `` Muestra los comandos del *breakpoint* número ``n`` +``commands `` Añade un comando al *breakpoint* número ``n`` +``condition `` Establece la condición ``c`` para el *breakpoint* número ``n`` +``c``, ``cont``, ``continue`` Continua la ejecución hasta el siguiente *breakpoint* +``debug`` Introduce un depurador recursivo que recorre el argumento de código (que es una expresión o sentencia arbitraria a ejecutar en el entorno actual). +``disable `` Desactiva el *breakpoint* número ``n`` +``display `` Muestra el valor del objeto dado +``d``, ``down`` Paso abajo de la llamada a la pila (*call stack*) +``enable `` Activa el *breakpoint* número ``n`` +``exec`` Ejecuta la sentencia (de una línea) en el contexto del marco de pila actual +``exit`` Salir del depurador +``h``, ``help`` Muestra la ayuda de los comandos +``h `` Muestra la ayuda del comando ``command`` +``ignore `` Ignora el *breakpoint* número ``n`` si la condición ``c`` es verdadera +``interact`` Ejecuta el comando ``pdb`` en el contexto de la función actual +``j``, ``jump`` Salta a la línea especificada (no se puede usar en el contexto de una función) +``l``, ``list`` Lista el código en la posición actual +``ll``, ``longlist`` Lista el código en la posición actual (más líneas) +``n``, ``next`` Ejecuta la siguiente línea (no va hacia abajo en funciones nuevas) +``p``, ``print`` Imprime el valor de una variable +``pp`` Imprime el valor de una variable (con formato) +``q``, ``quit`` Salir del depurador +``restart`` Reiniciar el programa python depurado +``r``, ``return`` Regresa de la función actual +``run`` Iniciar el programa python depurado +``rv``, ``retval`` Imprime el valor de retorno del último retorno de una función +``source`` Intenta obtener el código fuente del objeto dado y mostrarlo +``s``, ``step`` Ejecuta la siguiente línea (va hacia abajo en las nuevas funciones) +``tbreak`` Establece un *breakpoint* temporal +``unalias `` Elimina el alias +``undisplay `` Elimina el *display* número ``n`` +``unt``, ``until`` Sin argumento, continúa la ejecución hasta alcanzar la línea con un número mayor que el actual. +``u``, ``up`` Paso arriba de la llamada a la pila (*call stack*) +``whatis `` Muestra el tipo del objeto dado +``w``, ``where`` Muestra la traza de la pila actual +============================= ====================================================================== + +.. warning:: **Los comandos de depuración no son código Python** + + No puedes nombrar a las variables de la forma que quieras. Por ejemplo, + si esta dentro del depurador no podrá sobrescribir a las variables con el + mismo y, por tanto, **habrá que usar diferentes nombres para las + variables cuando este tecleando código en el depurador**. + + +.. _python_modulo_pdb_ayuda: + +Ayuda del depurador +................... + +Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: + +.. sourcecode:: pycon + + (Pdb) help + + Documented commands (type help ): + ======================================== + EOF c d h list q rv undisplay + a cl debug help ll quit s unt + alias clear disable ignore longlist r source until + args commands display interact n restart step up + b condition down j next return tbreak w + break cont enable jump p retval u whatis + bt continue exit l pp run unalias where + + Miscellaneous help topics: + ========================== + exec pdb + +---- + + +.. important:: + Usted puede descargar el código usado en esta sección haciendo clic en los + siguientes enlaces: + + - :download:`funcion_a_depurar.py <../../recursos/leccion6/funcion_a_depurar.py>`. + + - :download:`index_error.py <../../recursos/leccion6/index_error.py>`. + + - :download:`wiener_filtering.py <../../recursos/leccion6/wiener_filtering.py>`. + + +.. tip:: + Para ejecutar el código :file:`funcion_a_depurar.py`, :file:`index_error.py` + y :file:`wiener_filtering.py`, abra una consola de comando, acceda al directorio + donde se encuentra ambos programas: + + .. code-block:: console + :class: no-copy + + depuracion/ + ├── funcion_a_depurar.py + ├── index_error.py + └── wiener_filtering.py + + Si tiene la estructura de archivo previa, entonces ejecute por separado cada comando: + + .. code-block:: console + + python3 funcion_a_depurar.py + + .. code-block:: console + + pdb3 index_error.py + + .. code-block:: console + + python3 -m pdb wiener_filtering.py + + +---- + + +.. seealso:: + + Consulte la sección de :ref:`lecturas suplementarias ` + del entrenamiento para ampliar su conocimiento en esta temática. + + +---- + + +.. raw:: html + :file: ../_templates/partials/soporte_profesional.html + +.. + .. disqus:: diff --git a/source/leccion7/archivos.rst b/source/leccion7/archivos.rst index 8ec2569..4eeb29c 100644 --- a/source/leccion7/archivos.rst +++ b/source/leccion7/archivos.rst @@ -52,14 +52,13 @@ La forma preferida para cerrar un archivo es usando el método del tipo objeto Archivos con módulo os ...................... -El módulo ``os`` de Python le permite a usted realizar operaciones dependiente del +El módulo :mod:`os` de Python le permite a usted realizar operaciones dependiente del *Sistema Operativo* como crear una carpeta, listar contenidos de una carpeta, conocer acerca de un proceso, finalizar un proceso, etc. Este módulo tiene métodos para ver variables de entornos del *Sistema Operativo* con las cuales Python esta trabajando -en mucho más. `Aquí `_ la documentación -Python para el módulo ``os``. +en mucho más. -A continuación algunos útiles métodos del módulo ``os`` que pueden ayudar a manipular +A continuación algunos útiles métodos del módulo :mod:`os` que pueden ayudar a manipular archivos y carpeta en su programa Python: *Crear una nueva carpeta* @@ -224,8 +223,8 @@ operaciones de lectura y escritura en archivos``.csv``: :lines: 1-37 .. important:: - Usted puede descargar el código usado en esta sección haciendo clic en el - siguiente enlace: + Usted puede descargar el código usado en esta sección haciendo clic en los + siguientes enlaces: - :download:`colesterol.csv <../../recursos/leccion7/txt/colesterol.csv>`. @@ -323,7 +322,7 @@ Módulo csv .......... A continuación se presenta una práctica más real de implementar el uso del módulo -integrado en Python llamado `csv`_, el cual se implementa para operaciones de archivos +integrado en Python llamado :mod:`csv`, el cual se implementa para operaciones de archivos ``.csv``: .. literalinclude:: ../../recursos/leccion7/csv/main.py @@ -332,8 +331,8 @@ integrado en Python llamado `csv`_, el cual se implementa para operaciones de ar :lines: 1-45 .. important:: - Usted puede descargar el código usado en esta sección haciendo clic en el - siguiente enlace: + Usted puede descargar el código usado en esta sección haciendo clic en los + siguientes enlaces: - :download:`colesterol.csv <../../recursos/leccion7/csv/colesterol.csv>`. @@ -420,7 +419,7 @@ integrado en Python llamado `csv`_, el cual se implementa para operaciones de ar cambios realizados. Así de esta forma puede ver un ejemplo práctico de como manipular un archivo ``.csv`` con -el módulo `csv`_. +el módulo :mod:`csv`. ---- @@ -439,8 +438,8 @@ externa en Python llamada `pandas`_, el cual se implementa para operaciones de :lines: 1-24 .. important:: - Usted puede descargar el código usado en esta sección haciendo clic en el - siguiente enlace: + Usted puede descargar el código usado en esta sección haciendo clic en los + siguientes enlaces: - :download:`colesterol.csv <../../recursos/leccion7/pandas/colesterol.csv>`. @@ -504,8 +503,10 @@ Para salir de esa ayuda presione la tecla :keys:`q`. .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion7/archivo.py>`. + Usted puede descargar el código usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`archivo.py <../../recursos/leccion7/archivo.py>`. .. tip:: @@ -532,5 +533,4 @@ Para salir de esa ayuda presione la tecla :keys:`q`. .. .. disqus:: -.. _`csv`: https://docs.python.org/es/3.11/library/csv.html#module-csv .. _`pandas`: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-read-csv-table diff --git a/source/leccion8/distribucion.rst b/source/leccion8/distribucion.rst index 2a727fe..f28c252 100644 --- a/source/leccion8/distribucion.rst +++ b/source/leccion8/distribucion.rst @@ -4,9 +4,9 @@ Distribución de Software ------------------------ La distribución de código Python, le permite hacer portable de forma amigable usando -herramienta de gestión de paquetes Python como la herramienta ``pip``. Esta labor se -hace mediante el módulo :ref:`distutils `, y más -reciente incorporando el módulo :ref:`setuptools `. +herramienta de gestión de paquetes Python como la herramienta :ref:`pip `. +Esta labor se hace mediante el módulo :ref:`distutils `, y +más reciente incorporando el módulo :ref:`setuptools `. .. _python_modulo_distutils: @@ -31,7 +31,7 @@ a programar. Módulo setuptools ................. -El módulo ``setuptools``, incorpora varias extensiones al módulo ``distutils`` para +El módulo ``setuptools``, incorpora varias extensiones al módulo :mod:`distutils` para distribuciones de software grandes o complejas. @@ -561,7 +561,7 @@ Instalar distribución código fuente ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Para instalar una distribución código fuente de su paquete previamente creado, se -realizar usando la herramienta ``pip``, ejecutando el siguiente comando: +realizar usando la herramienta :ref:`pip `, ejecutando el siguiente comando: .. code-block:: console @@ -608,7 +608,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: De esta forma tiene instalado una distribución código fuente en formato **tarball** -de su paquete en el interprete Python usando la herramienta ``pip``. +de su paquete en el interprete Python usando la herramienta :ref:`pip `. .. _python_distro_instalar_bdist: @@ -617,7 +617,7 @@ Instalar distribución binaria ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Para instalar una distribución binaria de su paquete previamente creado, se -realizar usando la herramienta ``pip``, ejecutando el siguiente comando: +realizar usando la herramienta :ref:`pip `, ejecutando el siguiente comando: .. code-block:: console @@ -633,7 +633,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: Successfully installed tostadas-pipo-0.1 De esta forma tiene instalado una distribución binaria en formato **wheel** de su -paquete en el interprete Python usando la herramienta ``pip``. +paquete en el interprete Python usando la herramienta :ref:`pip `. ---- @@ -731,7 +731,7 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: Finished processing dependencies for tostadas-pipo==0.1 -De esta forma tiene instalado su paquete en su interprete Python usando el comando ``install`` +De esta forma tiene instalado su paquete en su interprete Python usando el comando :command:`install` disponible con el script :file:`setup.py`. ---- @@ -796,7 +796,7 @@ paquete ``tostadas_pipo-0.1`` se instalo correctamente. Eliminar paquete ................ -Para eliminar paquete usando la herramienta ``pip``, ejecute el siguiente comando: +Para eliminar paquete usando la herramienta :ref:`pip `, ejecute el siguiente comando: .. code-block:: console @@ -830,25 +830,25 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: Successfully uninstalled tostadas-pipo-0.1 -``pip`` esta habilitado a desinstalar la mayoría de paquetes instalados. Las excepciones +:ref:`pip ` esta habilitado a desinstalar la mayoría de paquetes instalados. Las excepciones conocidas son: - Los paquetes basado en solamente en el módulo :ref:`distutils ` los - cuales fueron instalados sin la herramienta ``pip`` usando el comando ``python3 setup.py install`` + cuales fueron instalados sin la herramienta :ref:`pip ` usando el comando :command:`python3 setup.py install` desde el :ref:`código del paquete `. - Instalándolo de esta forma, al momento de desintalarlo usando el comando ``pip uninstall tostadas_pipo`` + Instalándolo de esta forma, al momento de desintalarlo usando el comando :command:`pip uninstall tostadas_pipo` este comando removerá solo la metadata, no detrás dejando de la instalación metadata para determinar que archivos fueron instalados. - Entonces para solventar este problema tiene que ir manualmente al directorio ``site-packages`` a + Entonces para solventar este problema tiene que ir manualmente al directorio :file:`site-packages` a eliminar manualmente el paquete que instalo. .. warning:: Esta entrando a la cueva de los Dragones!!! -- Los scripts wrappers instalados ejecutando el comando ``python3 setup.py develop``. +- Los scripts wrappers instalados ejecutando el comando :command:`python3 setup.py develop`. De esta forma ya tiene eliminado su paquete de forma manual de su sistema. @@ -926,7 +926,9 @@ y :ref:`distutils `, ejecute el comando siguiente: .. important:: Usted puede descargar el código usado en esta sección, haciendo clic en el - siguiente enlace: :download:`distribucion.zip <../../recursos/leccion8/distribucion.zip>`. + siguiente enlace: + + - :download:`distribucion.zip <../../recursos/leccion8/distribucion.zip>`. .. tip:: diff --git a/source/leccion8/distribucion_nativa.rst b/source/leccion8/distribucion_nativa.rst index b2b2f44..2110341 100644 --- a/source/leccion8/distribucion_nativa.rst +++ b/source/leccion8/distribucion_nativa.rst @@ -24,7 +24,7 @@ Paquete auto-py-to-exe El paquete `auto-py-to-exe `_ le permite convertir archivos ``.py`` a archivos ``.exe`` usando una simple interfaz gráfica -de usuario para sistemas operativos Windows/Mac OS X. +de usuario para sistemas operativos Windows/macOS. A continuación el siguiente comando le permite instalarlo: @@ -83,13 +83,13 @@ Aquí puede definir lo siguiente: - Como generar el ``.exe`` - - Opciones especificas de *Windows/Mac OS X*. + - Opciones especificas de *Windows/macOS*. - Opciones especificas de *Windows*. - Opciones de búsqueda de ensamblaje en paralelo para *Windows* (avanzadas). - - Opciones especificas de *Mac OS X*. + - Opciones especificas de *macOS*. - Opciones especiales raramente usadas. @@ -129,7 +129,7 @@ de tu sistema operativo: .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console @@ -150,7 +150,7 @@ código fuente: :linenos: :lines: 1-12 -Este módulo usa las librerías `threading`_ y `time`_ para pausar la ejecución del modulo +Este módulo usa las librerías :mod:`threading` y :mod:`time` para pausar la ejecución del modulo en dos veces distintas, asi poder apreciar el mensaje que se muestra por la linea de comando. A continuación se explica la genera de la distribución binara para plataformas Windows y Linux: @@ -283,6 +283,3 @@ Así de esta forma genera una distribución nativa para plataformas Linux. .. .. disqus:: - -.. _`time`: https://docs.python.org/es/3.11/library/time.html#time.sleep -.. _`threading`: https://docs.python.org/es/3.11/library/threading.html#threading.Timer diff --git a/source/leccion8/index.rst b/source/leccion8/index.rst index f801c2b..e3839e0 100644 --- a/source/leccion8/index.rst +++ b/source/leccion8/index.rst @@ -15,11 +15,13 @@ A continuación el temario de esta lección: .. toctree:: :maxdepth: 2 + programacion_modular modulos paquetes distribucion distribucion_nativa scaffolding + pastescript ---- diff --git a/source/leccion8/modulos.rst b/source/leccion8/modulos.rst index a51cde8..8ee18bb 100644 --- a/source/leccion8/modulos.rst +++ b/source/leccion8/modulos.rst @@ -16,7 +16,7 @@ El código Python para un módulo nombrado ``funciones`` normalmente reside un archivo llamado :file:`utilidades.py`. A continuación un ejemplo de un simple módulo llamado :file:`utilidades.py`: -.. literalinclude:: ../../recursos/leccion8/modulos/utilidades.py +.. literalinclude:: ../../recursos/leccion8/modulos/pipo/utilidades.py :language: python :linenos: :lines: 1-8 @@ -44,7 +44,7 @@ Por ejemplo, al importar el módulo :file:`utilidades.py`, usted necesita coloca siguiente sentencia al tope del otro script Python. A continuación un ejemplo de un simple módulo llamado :file:`calculo_factura_pipo.py`. -.. literalinclude:: ../../recursos/leccion8/modulos/calculo_factura_pipo.py +.. literalinclude:: ../../recursos/leccion8/modulos/pipo/calculo_factura_pipo.py :language: python :linenos: :lines: 1-15 @@ -102,9 +102,10 @@ la secuencia siguiente: #. Si todas las anteriores fallan, Python busca la ruta predeterminada. En UNIX/Linux, la ruta predeterminada normalmente esta ``/usr/local/lib/python/``. -El ruta de búsqueda de módulo es almacenado en el módulo de system ``sys`` como -la variable ``sys.path``. La variable ``sys.path`` contiene el directorio actual, -``PYTHONPATH``, y las predeterminadas dependencia de instalación. +La ruta de búsqueda de módulo es almacenado en el módulo de Python :mod:`sys`, como +en ``sys.path`` la cual es una lista de cadenas que especifica la ruta de búsqueda de +los módulos. ``sys.path`` contiene el directorio actual, ``PYTHONPATH``, y las +predeterminadas dependencia de instalación. .. _python_variable_entorno_path: @@ -118,7 +119,7 @@ variable ``PATH``. .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL Así es una típica definición de ``PYTHONPATH`` desde un sistema UNIX/Linux, ejecutando el siguiente comando: @@ -185,20 +186,21 @@ sentencia ``global``, se soluciona el problema. Usted puede descargar el código usado en esta sección haciendo clic en los siguientes enlaces: - - :download:`utilidades.py <../../recursos/leccion8/modulos/utilidades.py>`. + - :download:`utilidades.py <../../recursos/leccion8/modulos/pipo/utilidades.py>`. - - :download:`calculo_factura_pipo.py <../../recursos/leccion8/modulos/calculo_factura_pipo.py>`. + - :download:`calculo_factura_pipo.py <../../recursos/leccion8/modulos/pipo/calculo_factura_pipo.py>`. .. tip:: Para ejecutar el código :file:`utilidades.py` y :file:`calculo_factura_pipo.py`, abra una consola de comando, acceda al directorio donde se encuentra ambos programas: - :: + .. code-block:: console + :class: no-copy - leccion8/ - ├── utilidades.py - └── calculo_factura_pipo.py + modulos/ + ├── utilidades.py + └── calculo_factura_pipo.py Si tiene la estructura de archivo previa, entonces ejecute el siguiente comando: diff --git a/source/leccion8/pastescript.rst b/source/leccion8/pastescript.rst new file mode 100644 index 0000000..60d7840 --- /dev/null +++ b/source/leccion8/pastescript.rst @@ -0,0 +1,285 @@ +.. _python_scaffolding_pastescript: + +PasteScript +----------- + +`PasteScript`_, es una herramienta de linea de comando basada en plugins que le permiten crear +estructuras de paquetes ":ref:`Scaffolding `" de proyectos Python además +sirve aplicaciones web, con configuraciones basadas en `paste.deploy`_. + + +Instalación +~~~~~~~~~~~ + +Para instalar este paquete ``PasteScript`` dentro de su `entorno virtual`_ activado use la +herramienta :ref:`pip ` ejecutando el siguiente comando, el cual a continuación +se presentan el correspondiente comando de tu sistema operativo: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + pip install PasteScript + + .. group-tab:: Windows + + .. code-block:: console + + pip install PasteScript + + +.. note:: + + No olvidar que estos paquetes han sido instalados con el entorno virtual que + previamente usted activo, eso quiere decir que los paquetes previamente + instalados con `easy_install`_ están instalados en el + directorio :file:`~/virtualenv/venv/lib/python3.x/site-packages/` en ves del + directorio de su versión de Python de sistema :file:`/usr/lib/python3.x/site-packages/` + +Al finalizar la instalación podrá opcionalmente consultar cuales plantillas +tiene disponible para usa, ejecutando el siguiente comando: + +.. code-block:: console + + paster create --list-templates + +El anterior código al ejecutar debe mostrar el siguiente mensaje: + +.. code-block:: console + :class: no-copy + + Available templates: + basic_package: A basic setuptools-enabled package + paste_deploy: A web application deployed through paste.deploy + +Usted puede usar el comando :command:`paster` para crear paquetes Python. + +.. code-block:: console + + paster create -t basic_package mipaquetepython + +El anterior código al ejecutar debe mostrar el siguiente mensaje: + +.. code-block:: console + :class: no-copy + + Selected and implied templates: + + PasteScript#basic_package A basic setuptools-enabled package + + Variables: + egg: mipaquetepython + package: mipaquetepython + project: mipaquetepython + Enter version (Version (like 0.1)) ['']: 0.1 + Enter description (One-line description of the package) ['']: Mi Paquete Básico + Enter long_description (Multi-line description (in reST)) ['']: Mi Paquete Básico para demostrar el uso de PasteScript + Enter keywords (Space-separated keywords/tags) ['']: PasteScript Basic Package Demo + Enter author (Author name) ['']: Pedro Picapiedra + Enter author_email (Author email) ['']: pedro@acme.com + Enter url (URL of homepage) ['']: https://github.com/pyve/mipaquetepython + Enter license_name (License name) ['']: GPL + Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: + Creating template basic_package + Creating directory ./mipaquetepython + Recursing into +package+ + Creating ./mipaquetepython/mipaquetepython/ + Copying __init__.py to + ./mipaquetepython/mipaquetepython/__init__.py + Copying setup.cfg to ./mipaquetepython/setup.cfg + Copying setup.py_tmpl to ./mipaquetepython/setup.py + Running /home/macagua/virtualenv/venv/bin/python setup.py egg_info + +Usted puede verificar el paquete previamente creado y observará como este +paquete básico ha habilitado el `Setuptools`_. + +.. code-block:: console + :class: no-copy + + mipaquetepython/ + |-- mipaquetepython + | `-- __init__.py + |-- mipaquetepython.egg-info + | |-- PKG-INFO + | |-- SOURCES.txt + | |-- dependency_links.txt + | |-- entry_points.txt + | |-- not-zip-safe + | `-- top_level.txt + |-- setup.cfg + `-- setup.py + +Para acceder al directorio principal :file:``mipaquetepython``, ejecute el siguiente comando: + +.. code-block:: console + + cd mipaquetepython/mipaquetepython/ + +Edite el archivo :file:`app.py` y agregue el siguiente código fuente: + +.. code-block:: console + + nano app.py + +Escriba un simple código que solicita un valor y luego lo muestra: + +.. code-block:: python + :linenos: + + var = input("Introduzca alguna frase: ") + print("Usted introdujo: ", var) + +Guarde los cambios en el archivo :file:`app.py`. + +Luego edite el archivo :file:`__init__.py` para importar su aplicación :file:`app.py` +con el siguiente código fuente: + +.. code-block:: python + :linenos: + + from mipaquetepython import app + +Para comprobar su instalación ejecute el siguiente comando: + +.. code-block:: console + + python3 + +Y realice una importación del paquete ``mipaquetepython`` ejecutando +el siguiente comando: + +.. code-block:: pycon + + >>> import mipaquetepython + Introduzca alguna frase: Esta cadena + Usted introdujo: Esta cadena + >>> exit() + +De esta forma tienes creado un :term:`paquete Egg` Python. + + +Esqueletos en diversos proyectos Python +....................................... + +A continuación se muestran algunos esqueletos útiles: + +- `Esqueletos de proyectos Zope/Plone`_. + +- `Esqueletos de proyectos Odoo (Antiguo OpenERP)`_. + + .. note:: + `Odoo`_, es un sistema ERP y CRM programado con Python, + de propósito general. + +- **Esqueletos de proyectos Django**: + + .. note:: + `Django`_, es un Framework Web Python, de propósito general. + + - `django-project-templates`_, plantillas Paster para crear proyectos + Django. + + - `fez.djangoskel`_, es una colección de plantillas Paster para crear + aplicaciones Django como :term:`paquetes Egg`. + + - `django-harness`_, es una aplicación destinada a simplificar las + tareas típicas relacionadas con la creación de un sitio web hechos + con Django, el mantenimiento de varias instalaciones (local, producción, + etc) y cuidando su instalación global y su estructura de "esqueleto" + actualizado del sitio de manera fácil. + + - `lfc-skel`_, Provee una plantilla para crear una aplicación `django-lfc`_ CMS. + +- **Esqueletos de proyectos Pylons**: + + .. note:: + `Pylons`_, es un Framework Web Python, de propósito general. + + - `Pylons`_, al instalarse usando la utilidad `easy_install`_ + instala dos plantillas de proyectos Pylons. + + - `PylonsTemplates`_, le ofrece plantillas adicionales ``paster`` para aplicaciones + Pylons, incluyendo implementación de ``repoze.what``. + + - `BlastOff`_, Una plantilla de aplicación `Pylons`_ que proporciona un + esqueleto de entorno de trabajo configurado con ``SQLAlchemy``, ``mako``, + ``repoze.who``, ``ToscaWidgets``, ``TurboMail``, ``WebFlash`` y (opcionalmente) + ``SchemaBot``. La aplicación generada esta previamente configurada con + autenticación, inicio de sesión y formularios de registro, y (opcionalmente) + confirmación de correo electrónico. ``BlastOff`` ayudar a acelerar el desarrollo + de aplicaciones en Pylons por que genera un proyecto con una serie de dependencias + configuraciones previamente. + +- **Esqueletos de proyectos Trac**: + + .. note:: + `Trac`_, es un sistema de gestión de proyectos de desarrollos de software. + + - `TracLegosScript`_, TracLegos es un software diseñado para ofrecer plantillas + para proyectos Trac y asiste con la creación de proyecto trac. + + - `trac_project`_, Plantilla de proyecto Trac de software de código abierto. + + +Recomendaciones +............... + +Si desea trabajar con algún proyecto de desarrollo basado en esqueletos o plantillas +``paster`` y Buildout simplemente seleccione cual esqueleto va a utilizar para su +desarrollo y proceso a instalarlo con `easy_install`_ o `PIP`_ (como se explico anteriormente) +y siga sus respectivas instrucciones para lograr con éxito la tarea deseada. + + +Referencias +........... + +- `Gestión de proyectos con Buildout, instalando Zope/Plone con este mecanismo`_ + desde la comunidad de Plone Venezuela. + + +---- + + +.. seealso:: + + Consulte la sección de :ref:`lecturas suplementarias ` + del entrenamiento para ampliar su conocimiento en esta temática. + + +---- + + +.. raw:: html + :file: ../_templates/partials/soporte_profesional.html + +.. + .. disqus:: + +.. _`PasteScript`: https://pypi.org/project/PasteScript +.. _`paste.deploy`: https://pypi.org/project/PasteDeploy +.. _`Odoo`: https://www.odoo.com/ +.. _`Django`: https://www.djangoproject.com/ +.. _`django-project-templates`: https://pypi.org/project/django-project-templates +.. _`fez.djangoskel`: https://pypi.org/project/fez.djangoskel +.. _`django-harness`: https://pypi.org/project/django-harness +.. _`lfc-skel`: https://pypi.org/project/lfc-skel/ +.. _`django-lfc`: https://pypi.org/project/django-lfc +.. _`ZopeSkel`: https://pypi.org/project/ZopeSkel +.. _`zopeproject`: https://pypi.org/project/zopeproject/ +.. _`grokcore.startup`: https://pypi.org/project/grokcore.startup +.. _`grokproject`: https://pypi.org/project/grokproject/ +.. _`Pylons`: https://pypi.org/project/Pylons/ +.. _`PylonsTemplates`: https://pypi.org/project/PylonsTemplates/ +.. _`BlastOff`: https://pypi.org/project/BlastOff/ +.. _`Trac`: https://pypi.org/project/Trac +.. _`TracLegosScript`: https://trac-hacks.org/wiki/TracLegosScript +.. _`trac_project`: https://trac-hacks.org/browser/traclegosscript/anyrelease/example/oss +.. _`Esqueletos de proyectos Zope/Plone`: https://plone-spanish-docs.readthedocs.io/es/latest/python/skel_proyectos_plone.html +.. _`Esqueletos de proyectos Odoo (Antiguo OpenERP)`: https://plone-spanish-docs.readthedocs.io/es/latest/python/skel_proyectos_openerp.html +.. _`PIP`: https://plone-spanish-docs.readthedocs.io/es/latest/python/distribute_pip.html +.. _`Gestión de proyectos con Buildout, instalando Zope/Plone con este mecanismo`: https://plone-spanish-docs.readthedocs.io/es/latest/buildout/index.html +.. _`entorno virtual`: https://plone-spanish-docs.readthedocs.io/es/latest/python/creacion_entornos_virtuales.html +.. _`easy_install`: https://plone-spanish-docs.readthedocs.io/es/latest/python/setuptools.html#que-es-easyinstall +.. _`Setuptools`: https://plone-spanish-docs.readthedocs.io/es/latest/python/setuptools.html diff --git a/source/leccion8/programacion_modular.rst b/source/leccion8/programacion_modular.rst new file mode 100644 index 0000000..4650ee9 --- /dev/null +++ b/source/leccion8/programacion_modular.rst @@ -0,0 +1,192 @@ +.. _python_programacion_modular: + +Programación modular +-------------------- + +La **programación modular** es un paradigma de desarrollo de software que consiste +en *dividir* un programa en partes más pequeñas y reutilizables, llamadas **módulos**. +En Python, un :ref:`módulo ` es simplemente un archivo ``.py`` que contiene +:ref:`funciones `, :ref:`clases `, :ref:`variables ` +o :ref:`constantes ` que pueden ser reutilizadas en otros programas. Esta +técnica ayuda a mejorar la **organización** del código, la **reutilización**, la **legibilidad** +y el **mantenimiento** de los proyectos. + + +Características +............... + +- **Reutilización de código**: Se pueden importar módulos en diferentes programas sin + necesidad de reescribir :ref:`funciones ` o :ref:`clases `. + +- **Mantenimiento más sencillo**: Facilita la actualización y corrección de errores sin + afectar el resto del programa. + +- **Legibilidad y estructura**: Permite organizar el código en archivos más pequeños y + especializados. + +- **Facilita el trabajo en equipo**: Cada programador puede desarrollar módulos independientes + que luego se integran en un proyecto mayor. + + +Práctica - Caso real +.................... + +A continuación se presenta una práctica más real de implementar la *programación modular* en Python: + +* **Uso de módulos de la librería estándar** + + Python incluye varios :ref:`módulos ` en la :ref:`librería estándar ` + que podemos usar sin necesidad de instalación adicional, como :mod:`math` o :ref:`datetime `: + + .. code-block:: pycon + + >>> import math + >>> print(math.sqrt(25)) # Calcula la raíz cuadrada de 25 + 5.0 + >>> + +#. **Creación de un módulo en Python** + + Suponga que tiene un unico módulo Python llamado :file:`calculos_matematicos.py` con el siguiente + codigo fuente: + + .. literalinclude:: ../../recursos/leccion8/modulos/calculadora/calculos_matematicos.py + :language: python + :linenos: + :lines: 1-19 + + Para ejecutar el módulo :file:`calculos_matematicos.py`, abra una consola de comando, acceda al + directorio donde se encuentra el mismo, y ejecute el siguiente comando: + + .. code-block:: console + + python3 calculos_matematicos.py + + El anterior código al ejecutar debe mostrar el siguiente mensaje: + + :: + + La suma es: 15 + La resta es: 5 + + + Y usted necesita reusar las :ref:`funciones ` en otros módulos. Para esto se + propone separar las funciones genericas en un módulo separado, por ejemplo, un módulo llamado + :file:`operaciones.py` el cual realiza cálculos matemáticos con el siguiente codigo fuente: + + .. literalinclude:: ../../recursos/leccion8/modulos/calculadora/operaciones.py + :language: python + :linenos: + :lines: 1-17 + + + .. tip:: + Un módulo en Python es simplemente un archivo con extensión `.py`. + + De esta manera, usted puede reutilizar el código de :file:`operaciones.py` en otros módulos + sin necesidad de reescribir las :ref:`funciones `. + + +#. **Importar una función en otro módulo** + + Puede importar y usar la :ref:`función ` de cálculos ``suma()`` en el archivo + :file:`calculo_suma.py` de la siguiente manera: + + .. literalinclude:: ../../recursos/leccion8/modulos/calculadora/calculo_suma.py + :language: python + :linenos: + :lines: 1-6 + + + Puede importar y usar la :ref:`función ` de cálculos ``resta()`` en el archivo + :file:`calculo_resta.py` de la siguiente manera: + + .. literalinclude:: ../../recursos/leccion8/modulos/calculadora/calculo_resta.py + :language: python + :linenos: + :lines: 1-6 + + + De esta manera, usted puede reutilizar el código de :file:`operaciones.py` en otros módulos Python. + + +.. important:: + La **programación modular** en Python es una práctica fundamental que mejora la **organización, + escalabilidad y eficiencia** del código. Al dividir un programa en módulos reutilizables, los + desarrolladores pueden trabajar de manera más estructurada y eficiente. + + +---- + + +.. important:: + Usted puede descargar el código usado en esta sección haciendo clic en los + siguientes enlaces: + + - :download:`calculos_matematicos.py <../../recursos/leccion8/modulos/calculadora/calculos_matematicos.py>`. + + - :download:`operaciones.py <../../recursos/leccion8/modulos/calculadora/operaciones.py>`. + + - :download:`calculo_suma.py <../../recursos/leccion8/modulos/calculadora/calculo_suma.py>`. + + - :download:`calculo_resta.py <../../recursos/leccion8/modulos/calculadora/calculo_resta.py>`. + + +.. tip:: + Para ejecutar el código :file:`operaciones.py`, :file:`calculo_suma.py` y :file:`calculo_resta.py`, + abra una consola de comando, acceda al directorio donde se encuentra ambos programas: + + .. code-block:: console + :class: no-copy + + calculadora/ + ├── operaciones.py + ├── calculo_suma.py + └── calculo_resta.py + + Si tiene la estructura de archivo previa, para ejecutar el módulo :file:`calculo_suma.py`, + abra una consola de comando, acceda al directorio donde se encuentra el mismo, y ejecute el + siguiente comando: + + .. code-block:: console + + python3 calculo_suma.py + + El anterior código al ejecutar debe mostrar el siguiente mensaje: + + :: + + La suma es: 15 + + Si tiene la estructura de archivo previa, para ejecutar el módulo :file:`calculo_resta.py`, + abra una consola de comando, acceda al directorio donde se encuentra el mismo, y ejecute el + siguiente comando: + + + .. code-block:: console + + python3 calculo_resta.py + + El anterior código al ejecutar debe mostrar el siguiente mensaje: + + :: + + La resta es: 5 + +---- + + +.. seealso:: + + Consulte la sección de :ref:`lecturas suplementarias ` + del entrenamiento para ampliar su conocimiento en esta temática. + + +---- + + +.. raw:: html + :file: ../_templates/partials/soporte_profesional.html + +.. + .. disqus:: diff --git a/source/leccion8/scaffolding.rst b/source/leccion8/scaffolding.rst index 88a8724..e1b57ab 100644 --- a/source/leccion8/scaffolding.rst +++ b/source/leccion8/scaffolding.rst @@ -1,16 +1,21 @@ -.. _python_skel: +.. _python_scaffolding: Scaffolding en proyectos Python ------------------------------- -.. sidebar:: Sobre este artículo +.. _scaffolding_python: - :Autor(es): Leonardo J. Caballero G. - :Correo(s): :email:`leonardoc@plone.org` - :Compatible con: Python 3.11 o versiones superiores - :Fecha: 23 de Noviembre de 2022 +¿Qué es el Scaffolding en Python? +................................. -.. _scaffolding_python: +**Scaffolding** (o “andamiaje” 🏗️) es una técnica de desarrollo que genera automáticamente la +estructura básica de un proyecto, incluyendo archivos, carpetas, y a veces código predefinido +(como controladores, modelos, vistas o rutas). Esto acelera el desarrollo inicial y mantiene +una arquitectura organizada. + +.. tip:: + 👉 En otras palabras, es como montar un esqueleto de tu aplicación para que tú solo te enfoques + en la lógica de negocio. La estructura del :term:`paquete Egg` Python es poco compleja. Por lo cual para empezar con su primer proyecto y diversos módulos, puede usar el concepto **Scaffolding** para @@ -20,233 +25,349 @@ Este concepto *scaffolding*, es muy útil para del arranque de su desarrollo, of serie de colecciones de plantillas *esqueletos* que permiten iniciar rápidamente proyectos, existente diversos *esqueletos* orientados a tipos de desarrollos específicos. -.. _que_es_pastescript: -¿Qué es PasteScript? -.................... +---- -Es una herramienta de linea de comando basada en plugins que le permiten crear -estructuras de paquetes de proyectos Python además sirve aplicaciones web, con -configuraciones basadas en `paste.deploy`_. +¿Por qué usar Scaffolding? +.......................... -Instalación -~~~~~~~~~~~ +- Ahorra tiempo al generar estructuras comunes. -Dentro de su `entorno virtual`_ activado debe instalar el paquete `PasteScript`_, -ejecutando el siguiente comando: +- Facilita buenas prácticas de arquitectura. -.. code-block:: console +- Mejora la organización del proyecto. - pip install PasteScript +- Acelera el inicio del desarrollo en frameworks web o CLI. -.. note:: - No olvidar que estos paquetes han sido instalados con el entorno virtual que - previamente usted activo, eso quiere decir que los paquetes previamente - instalados con `easy_install`_ están instalados en el - directorio :file:`~/virtualenv/venv/lib/python3.x/site-packages/` en ves del - directorio de su versión de Python de sistema :file:`/usr/lib/python3.x/site-packages/` +---- -Al finalizar la instalación podrá opcionalmente consultar cuales plantillas -tiene disponible para usa, ejecutando el siguiente comando: -.. code-block:: console +Herramientas comunes de Scaffolding en Python +............................................. - paster create --list-templates ++-----------------------------+--------------------------------------------+----------------------+ +| Herramientas | Uso | Ejemplo | ++-----------------------------+--------------------------------------------+----------------------+ +| `cookiecutter` | Plantillas para cualquier tipo de proyecto | Web, CLI, librerías | ++-----------------------------+--------------------------------------------+----------------------+ +| `flask CLI` + extensiones | Estructura básica de proyectos | Aplicación Web | +| | para :ref:`Flask `. | | ++-----------------------------+--------------------------------------------+----------------------+ +| `django-admin startproject` | Estructura básica de proyectos | Aplicación Web | +| | para :ref:`Django `. | | ++-----------------------------+--------------------------------------------+----------------------+ +| `fastapi-code-generator` | Generar base de API desde OpenAPI | Aplicación APIs REST | +| | para :ref:`FastAPI `. | | ++-----------------------------+--------------------------------------------+----------------------+ -.. code-block:: console - Available templates: - basic_package: A basic setuptools-enabled package - paste_deploy: A web application deployed through paste.deploy +---- -Usted puede usar el comando :command:`paster` para crear paquetes Python. -.. code-block:: console +Ejemplo 1: Paquete Python +......................... - paster create -t basic_package mipaquetepython +`cookiecutter`_, ofrece varias plantillas para cualquier tipo de proyecto Python. -.. code-block:: console +Para este caso, vamos a generar un proyecto de ejemplo para un paquete Python +que se llama ``mi_paquete``. + +Paso 1: Instalación +~~~~~~~~~~~~~~~~~~~ + +Para instalar este paquete ``cookiecutter`` use la herramienta :ref:`pip ` +ejecutando el siguiente comando, el cual a continuación se presentan el correspondiente +comando de tu sistema operativo: + +.. tabs:: - Selected and implied templates: - - PasteScript#basic_package A basic setuptools-enabled package - - Variables: - egg: mipaquetepython - package: mipaquetepython - project: mipaquetepython - Enter version (Version (like 0.1)) ['']: 0.1 - Enter description (One-line description of the package) ['']: Mi Paquete Básico - Enter long_description (Multi-line description (in reST)) ['']: Mi Paquete Básico para demostrar el uso de PasteScript - Enter keywords (Space-separated keywords/tags) ['']: PasteScript Basic Package Demo - Enter author (Author name) ['']: Pedro Picapiedra - Enter author_email (Author email) ['']: pedro@acme.com - Enter url (URL of homepage) ['']: https://github.com/pyve/mipaquetepython - Enter license_name (License name) ['']: GPL - Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: - Creating template basic_package - Creating directory ./mipaquetepython - Recursing into +package+ - Creating ./mipaquetepython/mipaquetepython/ - Copying __init__.py to - ./mipaquetepython/mipaquetepython/__init__.py - Copying setup.cfg to ./mipaquetepython/setup.cfg - Copying setup.py_tmpl to ./mipaquetepython/setup.py - Running /home/macagua/virtualenv/venv/bin/python setup.py egg_info - -Usted puede verificar el paquete previamente creado y observará como este -paquete básico ha habilitado el `Setuptools`_. + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + pip3 install cookiecutter + + .. group-tab:: Windows + + .. code-block:: console + + pip3 install cookiecutter + + +Paso 2: Crear paquete Python +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`cookiecutter-pypackage`_, es una plantilla ``cookiecutter`` para un paquete Python. .. code-block:: console - tree mipaquetepython/ + cookiecutter https://github.com/audreyfeldroy/cookiecutter-pypackage + + +Paso 3: Responder preguntas +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +El generador te preguntará: + +.. code-block:: console + :class: no-copy + + [1/14] full_name (Audrey Roy Greenfeld): Leonardo J. Caballero G. + [2/14] email (audreyr@example.com): leonardocaballero@gmail.com + [3/14] github_username (audreyr): macagua + [4/14] project_name (Python Boilerplate): Mi Paquete + [5/14] project_slug (mi_paquete): + [6/14] project_short_description (Python Boilerplate contains all the boilerplate you need to create a Python package.): Mi primer paquete Python + [7/14] pypi_username (macagua): + [8/14] version (0.1.0): 0.0.1 + [9/14] use_pytest (n): y + [10/14] use_pypi_deployment_with_travis (y): + [11/14] add_pyup_badge (n): + [12/14] Select command_line_interface + 1 - Typer + 2 - Argparse + 3 - No command-line interface + Choose from [1/2/3] (1): + [13/14] create_author_file (y): + [14/14] Select open_source_license + 1 - MIT license + 2 - BSD license + 3 - ISC license + 4 - Apache Software License 2.0 + 5 - GNU General Public License v3 + 6 - Not open source + Choose from [1/2/3/4/5/6] (1): + + +✅ Resultado: carpeta con todo lo necesario: .. code-block:: console + :class: no-copy + + mi_paquete/ + ├── AUTHORS.rst + ├── CODE_OF_CONDUCT.rst + ├── CONTRIBUTING.rst + ├── docs + │ ├── authors.rst + │ ├── conf.py + │ ├── contributing.rst + │ ├── history.rst + │ ├── index.rst + │ ├── installation.rst + │ ├── make.bat + │ ├── Makefile + │ ├── readme.rst + │ └── usage.rst + ├── HISTORY.rst + ├── LICENSE + ├── Makefile + ├── MANIFEST.in + ├── pyproject.toml + ├── README.rst + ├── requirements_dev.txt + ├── ruff.toml + ├── src + │ └── mi_paquete + │ ├── cli.py + │ ├── __init__.py + │ └── mi_paquete.py + ├── tests + │ ├── __init__.py + │ └── test_mi_paquete.py + └── tox.ini - mipaquetepython/ - |-- mipaquetepython - | `-- __init__.py - |-- mipaquetepython.egg-info - | |-- PKG-INFO - | |-- SOURCES.txt - | |-- dependency_links.txt - | |-- entry_points.txt - | |-- not-zip-safe - | `-- top_level.txt - |-- setup.cfg - `-- setup.py - -Para instalar este paquete ejecute el siguiente comando: + +---- + + +Ejemplo 2: Proyecto Django +.......................... + +Por defecto, :ref:`Django ` incluye un comando para crear un nuevo proyecto y aplicaciones. + +Paso 1: Instalación +~~~~~~~~~~~~~~~~~~~ + +Para instalar este paquete :ref:`Django ` use la herramienta :ref:`pip ` +ejecutando el siguiente comando, el cual a continuación se presentan el correspondiente +comando de tu sistema operativo: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + pip3 install Django + + .. group-tab:: Windows + + .. code-block:: console + + pip3 install Django + + +Paso 2: Crear proyecto +~~~~~~~~~~~~~~~~~~~~~~ + +Para crear un nuevo proyecto :ref:`Django `, ejecuta el siguiente comando: .. code-block:: console - cd mipaquetepython/mipaquetepython/ + django-admin startproject mi_sitio && cd mi_sitio + + +Paso 3: Crear aplicación +~~~~~~~~~~~~~~~~~~~~~~~~ + +Para crear una aplicación dentro del proyecto :ref:`Django `, usa el siguiente comando: .. code-block:: console - vim app.py + python3 manage.py startapp blog -Escriba un simple código que solicita un valor y luego lo muestra: -.. code-block:: python - :linenos: +✅ Resultado: Carpetas listas para modelos, vistas, formularios y rutas. - var = input("Introduzca alguna frase: ") - print("Usted introdujo: ", var) +.. code-block:: console + :class: no-copy + + mi_sitio/ + ├── blog + │ ├── admin.py + │ ├── apps.py + │ ├── __init__.py + │ ├── migrations + │ │ └── __init__.py + │ ├── models.py + │ ├── tests.py + │ └── views.py + ├── manage.py + └── mi_sitio + ├── asgi.py + ├── __init__.py + ├── settings.py + ├── urls.py + └── wsgi.py -Guarde los cambios en el archivo :file:`app.py`, luego importe su aplicación -:file:`app.py` en el archivo :file:`__init__.py` con el siguiente código fuente: -.. code-block:: python - :linenos: +---- + - from mipaquetepython import app +Ejemplo 3: Proyecto FastAPI +........................... -Para comprobar su instalación ejecute el siguiente comando: +Puedes usar generadores como `fastapi-code-generator`_ para :ref:`FastAPI `, `SQLModel`_, y `Typer`_ +o montar tu estructura así: .. code-block:: console + :class: no-copy - python3 + app/ + ├── main.py + ├── models/ + ├── routers/ + ├── services/ + └── config.py -Y realice una importación del paquete ``mipaquetepython`` ejecutando -el siguiente comando: +O usar generadores personalizados. -.. code-block:: pycon +Paso 1: Instalación +~~~~~~~~~~~~~~~~~~~ - >>> import mipaquetepython - Introduzca alguna frase: Esta cadena - Usted introdujo: Esta cadena - >>> exit() +Para instalar este paquete ``fastapi-code-generator`` use la herramienta :ref:`pip ` +ejecutando el siguiente comando, el cual a continuación se presentan el correspondiente +comando de tu sistema operativo: -De esta forma tienes creado un :term:`paquete Egg` Python. +.. tabs:: + .. group-tab:: macOS, Linux, y Windows con WSL -Esqueletos en diversos proyectos Python -....................................... + .. code-block:: console -A continuación se muestran algunos esqueletos útiles: + pip3 install "fastapi-code-generator==0.5.2" -- `Esqueletos de proyectos Zope/Plone`_. + .. group-tab:: Windows -- `Esqueletos de proyectos Odoo (Antiguo OpenERP)`_. + .. code-block:: console - .. note:: - `Odoo`_, es un sistema ERP y CRM programado con Python, - de propósito general. + pip3 install fastapi-code-generator -- **Esqueletos de proyectos Django**: +Usted puede probar la instalación existe, ejecutando el siguiente comando: - .. note:: - `Django`_, es un Framework Web Python, de propósito general. +.. tabs:: - - `django-project-templates`_, plantillas Paster para crear proyectos - Django. + .. group-tab:: macOS, Linux, y Windows con WSL - - `fez.djangoskel`_, es una colección de plantillas Paster para crear - aplicaciones Django como :term:`paquetes Egg`. + .. code-block:: console - - `django-harness`_, es una aplicación destinada a simplificar las - tareas típicas relacionadas con la creación de un sitio web hechos - con Django, el mantenimiento de varias instalaciones (local, producción, - etc) y cuidando su instalación global y su estructura de "esqueleto" - actualizado del sitio de manera fácil. + python3 -c "import fastapi_code_generator ; print(fastapi_code_generator.__package__)" - - `lfc-skel`_, Provee una plantilla para crear una aplicación `django-lfc`_ CMS. + .. group-tab:: Windows -- **Esqueletos de proyectos Pylons**: + .. code-block:: console - .. note:: - `Pylons`_, es un Framework Web Python, de propósito general. + python3 -c "import fastapi_code_generator ; print(fastapi_code_generator.__package__)" - - `Pylons`_, al instalarse usando la utilidad `easy_install`_ - instala dos plantillas de proyectos Pylons. +Si muestra el nombre del módulo ``fastapi_code_generator``, tiene correctamente instalado el módulo. +Con esto, ya tiene todo listo para continuar. - - `PylonsTemplates`_, le ofrece plantillas adicionales ``paster`` para aplicaciones - Pylons, incluyendo implementación de ``repoze.what``. +.. code-block:: console - - `BlastOff`_, Una plantilla de aplicación `Pylons`_ que proporciona un - esqueleto de entorno de trabajo configurado con ``SQLAlchemy``, ``mako``, - ``repoze.who``, ``ToscaWidgets``, ``TurboMail``, ``WebFlash`` y (opcionalmente) - ``SchemaBot``. La aplicación generada esta previamente configurada con - autenticación, inicio de sesión y formularios de registro, y (opcionalmente) - confirmación de correo electrónico. ``BlastOff`` ayudar a acelerar el desarrollo - de aplicaciones en Pylons por que genera un proyecto con una serie de dependencias - configuraciones previamente. + fastapi-codegen --help -- **Esqueletos de proyectos CherryPy**: - .. note:: - `CherryPy`_, es un MicroFramework Web Python, de propósito general. - - `CherryPaste`_, Usar CherryPy dentro Paste. +.. code-block:: console + :class: no-copy + + Usage: fastapi-codegen [OPTIONS] + + ╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ --encoding -e TEXT [default: utf-8] │ + │ * --input -i TEXT [default: None] [required] │ + │ * --output -o PATH [default: None] [required] │ + │ --model-file -m TEXT [default: None] │ + │ --template-dir -t PATH [default: None] │ + │ --model-template-dir PATH [default: None] │ + │ --enum-field-as-literal [all|one] [default: None] │ + │ --generate-routers -r │ + │ --specify-tags TEXT [default: None] │ + │ --custom-visitor -c PATH [default: None] │ + │ --disable-timestamp │ + │ --output-model-type -d [pydantic.BaseModel|pydantic_v2.BaseModel|dataclasses.dataclass|typing.TypedDict|ms [default: pydantic.BaseModel] │ + │ gspec.Struct] │ + │ --python-version -p [3.6|3.7|3.8|3.9|3.10|3.11|3.12] [default: 3.8] │ + │ --install-completion Install completion for the current shell. │ + │ --show-completion Show completion for the current shell, to copy it or customize the installation. │ + │ --help Show this message and exit. │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -- **Esqueletos de proyectos Trac**: - .. note:: - `Trac`_, es un sistema de gestión de proyectos de desarrollos de software. +---- - - `TracLegosScript`_, TracLegos es un software diseñado para ofrecer plantillas - para proyectos Trac y asiste con la creación de proyecto trac. +Conclusión +.......... - - `trac_project`_, Plantilla de proyecto Trac de software de código abierto. +- **Scaffolding** en Python no es algo nativo del lenguaje, pero se apoya en herramientas que te ayudan a estructurar + sus proyectos rápidamente. +- Puedes usarlo para crear APIs, CLI, librerías, dashboards y más. -Recomendaciones -............... +- Ideal para mantener orden desde el principio y escalar de forma profesional. -Si desea trabajar con algún proyecto de desarrollo basado en esqueletos o plantillas -``paster`` y Buildout simplemente seleccione cual esqueleto va a utilizar para su -desarrollo y proceso a instalarlo con `easy_install`_ o `PIP`_ (como se explico anteriormente) -y siga sus respectivas instrucciones para lograr con éxito la tarea deseada. +---- +.. important:: + Usted puede descargar el código usado en esta sección, haciendo clic en los + siguientes enlaces: -Referencias -........... + - :download:`mi_paquete.zip <../../recursos/leccion8/mi_paquete.zip>`. -- `Gestión de proyectos con Buildout, instalando Zope/Plone con este mecanismo`_ - desde la comunidad de Plone Venezuela. + - :download:`mi_sitio.zip <../../recursos/leccion8/mi_sitio.zip>`. ---- @@ -267,31 +388,9 @@ Referencias .. .. disqus:: -.. _`PasteScript`: https://pypi.org/project/PasteScript -.. _`paste.deploy`: https://pypi.org/project/PasteDeploy -.. _`Odoo`: https://www.odoo.com/ +.. _`cookiecutter`: https://pypi.org/project/cookiecutter/ +.. _`cookiecutter-pypackage`: https://github.com/audreyfeldroy/cookiecutter-pypackage .. _`Django`: https://www.djangoproject.com/ -.. _`django-project-templates`: https://pypi.org/project/django-project-templates -.. _`fez.djangoskel`: https://pypi.org/project/fez.djangoskel -.. _`django-harness`: https://pypi.org/project/django-harness -.. _`lfc-skel`: https://pypi.org/project/lfc-skel/ -.. _`django-lfc`: https://pypi.org/project/django-lfc -.. _`ZopeSkel`: https://pypi.org/project/ZopeSkel -.. _`zopeproject`: https://pypi.org/project/zopeproject/ -.. _`grokcore.startup`: https://pypi.org/project/grokcore.startup -.. _`grokproject`: https://pypi.org/project/grokproject/ -.. _`Pylons`: https://pypi.org/project/Pylons/ -.. _`PylonsTemplates`: https://pypi.org/project/PylonsTemplates/ -.. _`BlastOff`: https://pypi.org/project/BlastOff/ -.. _`CherryPy`: https://pypi.org/project/CherryPy -.. _`CherryPaste`: https://pypi.org/project/CherryPaste -.. _`Trac`: https://pypi.org/project/Trac -.. _`TracLegosScript`: https://trac-hacks.org/wiki/TracLegosScript -.. _`trac_project`: https://trac-hacks.org/browser/traclegosscript/anyrelease/example/oss -.. _`Esqueletos de proyectos Zope/Plone`: https://plone-spanish-docs.readthedocs.io/es/latest/python/skel_proyectos_plone.html -.. _`Esqueletos de proyectos Odoo (Antiguo OpenERP)`: https://plone-spanish-docs.readthedocs.io/es/latest/python/skel_proyectos_openerp.html -.. _`PIP`: https://plone-spanish-docs.readthedocs.io/es/latest/python/distribute_pip.html -.. _`Gestión de proyectos con Buildout, instalando Zope/Plone con este mecanismo`: https://plone-spanish-docs.readthedocs.io/es/latest/buildout/index.html -.. _`entorno virtual`: https://plone-spanish-docs.readthedocs.io/es/latest/python/creacion_entornos_virtuales.html -.. _`easy_install`: https://plone-spanish-docs.readthedocs.io/es/latest/python/setuptools.html#que-es-easyinstall -.. _`Setuptools`: https://plone-spanish-docs.readthedocs.io/es/latest/python/setuptools.html +.. _`fastapi-code-generator`: https://pypi.org/project/fastapi-code-generator/ +.. _`SQLModel`: https://sqlmodel.tiangolo.com/ +.. _`Typer`: https://typer.tiangolo.com/ diff --git a/source/leccion9/clases_integradas.rst b/source/leccion9/clases_integradas.rst index c6de695..5bdbf50 100644 --- a/source/leccion9/clases_integradas.rst +++ b/source/leccion9/clases_integradas.rst @@ -117,7 +117,7 @@ resultante también será correcto en Python 3.0. quit ~~~~~ -Es el método constructor de la clase ``Quitter`` incluida en el módulo ``site`` el +Es el método constructor de la clase ``Quitter`` incluida en el módulo :mod:`site` el cual le permite salir de la consola interactiva Python: .. code-block:: pycon @@ -337,7 +337,7 @@ Las clases de tipos *archivos* se describen a continuación: file() ~~~~~~ -El objeto ``file()`` se implementan con el paquete del lenguaje C ``stdio`` y se pueden +El objeto ``file()`` se implementan con el paquete del *lenguaje C* ``stdio`` y se pueden crear con la función interna :ref:`open() `. También son el resultado de otras funciones y métodos internos, por ejemplo, ``os.popen()`` y ``os.fdopen()`` y el método ``makefile()`` de los objetos ``socket``. @@ -371,8 +371,8 @@ recursos tomados por el manejo del archivo. Eso se hace con la sentencia ``archi >>> archivo.close() # cierra el archivo datos.txt -Luego de lo cual no se puede acceder al archivo ``datos.txt``, si intenta una llamada a -la método :ref:`archivo.read() ` devuelve una excepción +Luego de lo cual no se puede acceder al archivo :file:`datos.txt`, si intenta una llamada +al método :ref:`archivo.read() ` devuelve una excepción :ref:`ValueError `, porque el archivo está cerrado: .. code-block:: pycon @@ -558,7 +558,7 @@ El método ``seek()`` lleva la siguiente nomenclatura: >>> seek(posicion_actual[, punto_referencia]) -A continuación, un ejemplo que escribir y leer el archivo ``datos.txt`` agregando una +A continuación, un ejemplo que escribir y leer el archivo :file:`datos.txt` agregando una lista de lineas al principio del archivo, como al final del archivo: .. code-block:: pycon diff --git a/source/leccion9/errores.rst b/source/leccion9/errores.rst index 14d1977..f7abf73 100644 --- a/source/leccion9/errores.rst +++ b/source/leccion9/errores.rst @@ -506,10 +506,9 @@ Traceback El ``traceback`` o *trazado inverso*, es un listado de las funciones en curso de ejecución, presentadas cuando sucede un error en tiempo de ejecución. Es común que al trazado inverso también se le conozca como *trazado de pila*, porque lista las funciones en el orden en el -cual son almacenadas en la -`pila de llamadas `_. +cual son almacenadas en la `pila de llamadas`_. -El módulo integrado `traceback`_ incorpora el mismo comportamiento de ``Traceback`` o *trazado +El módulo integrado :mod:`traceback` incorpora el mismo comportamiento de ``Traceback`` o *trazado inverso* ya que extrae, formatea e imprime información acerca de *trazado del stack* de los errores y excepciones en Python. @@ -575,4 +574,5 @@ errores y excepciones en Python. .. .. disqus:: -.. _`traceback`: https://docs.python.org/es/3.11/library/traceback.html + +.. _`pila de llamadas`: https://es.wikipedia.org/wiki/Pila_(estructura_de_datos)#Pila_de_llamadas diff --git a/source/leccion9/herencia.rst b/source/leccion9/herencia.rst index b041276..a2b31e9 100644 --- a/source/leccion9/herencia.rst +++ b/source/leccion9/herencia.rst @@ -156,8 +156,11 @@ permite corroborar si un objeto es instancia de una clase. .. important:: Usted puede descargar el código usado en esta sección haciendo clic en los - siguientes enlaces: :download:`clases.py <../../recursos/leccion9/clases.py>` - y :download:`herencia_simple.py <../../recursos/leccion9/herencia_simple.py>`. + siguientes enlaces: + + - :download:`clases.py <../../recursos/leccion9/clases.py>`. + + - :download:`herencia_simple.py <../../recursos/leccion9/herencia_simple.py>`. .. tip:: @@ -237,8 +240,11 @@ a ``Supervisor`` primero por que ese aparece primero de izquierda a derecha. .. important:: Usted puede descargar el código usado en esta sección haciendo clic en los - siguientes enlaces: :download:`clases.py <../../recursos/leccion9/clases.py>` - y :download:`herencia_multiple.py <../../recursos/leccion9/herencia_multiple.py>`. + siguientes enlaces: + + - :download:`clases.py <../../recursos/leccion9/clases.py>`. + + - :download:`herencia_multiple.py <../../recursos/leccion9/herencia_multiple.py>`. .. tip:: diff --git a/source/leccion9/index.rst b/source/leccion9/index.rst index cc0d618..0bb635b 100644 --- a/source/leccion9/index.rst +++ b/source/leccion9/index.rst @@ -16,7 +16,7 @@ el temario de esta lección: errores exceptions - poo + programacion_orientada_objetos herencia abstraccion polimorfismo diff --git a/source/leccion9/poo.rst b/source/leccion9/programacion_orientada_objetos.rst similarity index 94% rename from source/leccion9/poo.rst rename to source/leccion9/programacion_orientada_objetos.rst index 076b866..e4c7cac 100644 --- a/source/leccion9/poo.rst +++ b/source/leccion9/programacion_orientada_objetos.rst @@ -205,6 +205,7 @@ Usted puede probar el código anterior, si lo transcribe en el :ref:`consola interactiva ` Python como lo siguiente: .. code-block:: pycon + :class: no-copy >>> class Persona: ... """Clase que representa una Persona""" @@ -226,12 +227,10 @@ Usted puede probar el código anterior, si lo transcribe en el 'Caballero' >>> macagua.sexo 'M' - >>> print("El objeto de la clase {}, {}.".format(macagua.__name__, macagua.__doc__)) + >>> print(f"El objeto de la clase {macagua.__name__}, {macagua.__doc__}.") El objeto de la clase Persona, Clase que representa una Persona. >>> print( - ... "Hola, mucho gusto, mi nombre es '{} {}', \nmi cédula de identidad es '{}', y mi sexo es '{}'.".format( - ... macagua.nombre, macagua.apellido, macagua.cedula, macagua.sexo - ... ) + ... f"Hola, mucho gusto, mi nombre es '{macagua.nombre} {macagua.apellido}', \nmi cédula de identidad es '{macagua.cedula}', y mi sexo es '{macagua.sexo}'." ... ) Hola, mucho gusto, mi nombre es 'Leonardo Caballero', mi cédula de identidad es 'V-13458796', y mi sexo es 'M'. @@ -242,14 +241,16 @@ especiales. - __name__, describe el nombre del objeto o del método. .. code-block:: pycon + :class: no-copy >>> macagua.__name__ 'Persona' -- __doc__, contiene la documentación de un módulo, una clase, o método especifico, +- ``__doc__``, contiene la documentación de un módulo, una clase, o método especifico, escrita en el formato :ref:`docstrings `. .. code-block:: pycon + :class: no-copy >>> macagua.__doc__ 'Clase que representa una Persona' @@ -258,6 +259,7 @@ Si el nombre de un atributo esta con dobles guiones bajos al principio son atrib "escondidos". A continuación un pseudo código que ilustra un ejemplo: .. code-block:: pycon + :class: no-copy >>> ms_windows.__privado 'True' @@ -281,8 +283,8 @@ La ejecución de un método puede conducir a cambiar el estado del objeto. Se definen de la misma forma que las funciones normales pero deben declararse dentro de la clase y su primer argumento siempre referencia a la instancia que la llama, de -esta forma se afirma que los métodos son -:ref:`funciones `, adjuntadas a :ref:`objectos `. +esta forma se afirma que los métodos son :ref:`funciones `, +adjuntadas a :ref:`objectos `. .. note:: Usted puede encontrar ejemplos en las funciones de @@ -295,7 +297,7 @@ Si el objeto es ``Persona``, los métodos pueden ser: ``hablar``, ``caminar``, .. literalinclude:: ../../recursos/leccion9/poo.py :language: python :linenos: - :lines: 1-16 + :lines: 1-18 La única diferencia sintáctica entre la definición de un método y la definición de una función es que el primer parámetro del método por convención debe ser el nombre ``self``. @@ -304,6 +306,7 @@ Usted puede probar el código anterior, si lo transcribe en el :ref:`consola int Python como lo siguiente: .. code-block:: pycon + :class: no-copy >>> class Persona: ... """Clase que representa una Persona""" @@ -321,6 +324,7 @@ Python como lo siguiente: Analizar la estructura de la clase el cual representa a una Persona: .. code-block:: pycon + :class: no-copy >>> type(Persona()) @@ -332,7 +336,7 @@ Analizar la estructura de la clase el cual representa a una Persona: >>> Persona().hablar.__doc__ 'Mostrar mensaje de saludo de Persona' - >>> Persona().hablar("Hola, soy la clase {0}.".format(macagua.__class__.__name__)) + >>> Persona().hablar(f"Hola, soy la clase {macagua.__class__.__name__}.") 'Hola, soy la clase Persona.' >>> @@ -424,7 +428,8 @@ en lugar de ``self``. Del mismo modo, los métodos de clase utilizan el prefijo ``cls`` para referirse a los atributos de la clase. -:: +.. code-block:: console + :class: no-copy class : ... @@ -450,7 +455,8 @@ y métodos de la instancia. Para referirse a los elementos de la clase, se debe utilizar el nombre de la clase como prefijo. -:: +.. code-block:: console + :class: no-copy class : ... @@ -560,8 +566,10 @@ permite corroborar si un objeto es instancia de una clase. .. important:: - Usted puede descargar el código usado en esta sección haciendo clic - :download:`aquí <../../recursos/leccion9/poo.py>`. + Usted puede descargar el código usado en esta sección haciendo clic en el + siguiente enlace: + + - :download:`poo.py <../../recursos/leccion9/poo.py>`. .. tip:: @@ -573,6 +581,14 @@ permite corroborar si un objeto es instancia de una clase. python3 poo.py + El anterior código al ejecutar debe mostrar el siguiente mensaje: + + :: + + Hola, mucho gusto, mi nombre es 'Leonardo Caballero', + mi cédula de identidad es 'V-26938401', y mi sexo es 'M'. + + .. seealso:: Consulte la sección de :ref:`lecturas suplementarias ` diff --git a/source/lecturas.rst b/source/lecturas.rst index fd8d75b..fbc04d7 100644 --- a/source/lecturas.rst +++ b/source/lecturas.rst @@ -78,6 +78,10 @@ Inmersión al modo interactivo de Python - `Guía de aprendizaje de Python `_. +- `ipython - PyPI `_. + +- `bpython - PyPI `_. + .. _lecturas_extras_leccion3: @@ -237,13 +241,15 @@ Programación estructurada .. _lecturas_extras_leccion6: -Lección 6 - Introspección a la depuración con pdb -------------------------------------------------- +Lección 6 - Introspección a la depuración de software +----------------------------------------------------- - `pdb - The Python Debugger `_. - `Usando el depurador Python - Python Scientific Lecture Notes (Spanish translation) `_. +- `ipdb - PyPI `_. + - Ver el anexo :numref:`anexos_N4NtB4r28h0` sobre los *Depurando um programa Python com pdb*.