From 7e41879b2e725f4c110f3fa8cc7ab6b4b2faff45 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 20 Mar 2025 13:01:33 +0100 Subject: [PATCH 01/43] Fixed some typos --- source/leccion10/json.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/leccion10/json.rst b/source/leccion10/json.rst index 9fa74fe..a1cb2b1 100644 --- a/source/leccion10/json.rst +++ b/source/leccion10/json.rst @@ -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 From dd5bc8108d45eb4d5eb5e34b28b3ef8ee4b280bd Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 3 Apr 2025 11:04:22 +0200 Subject: [PATCH 02/43] Added new entry for the intersphinx_mapping settings --- source/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/conf.py b/source/conf.py index 7a3c795..3133d9a 100644 --- a/source/conf.py +++ b/source/conf.py @@ -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, From b911b236b522f2605957f8ff480c1a8c57b8e13e Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 3 Apr 2025 11:05:27 +0200 Subject: [PATCH 03/43] Updated the ipython section --- source/leccion2/ipython.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/leccion2/ipython.rst b/source/leccion2/ipython.rst index adb729c..db0671f 100644 --- a/source/leccion2/ipython.rst +++ b/source/leccion2/ipython.rst @@ -69,9 +69,9 @@ 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]: From 0da9a10a7fca2fcefcca3b05247b4e925d0822fb Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 3 Apr 2025 11:13:01 +0200 Subject: [PATCH 04/43] Updated the depuracion section --- source/esquema.rst | 8 +-- source/leccion6/index.rst | 9 +-- source/leccion6/{depuracion.rst => pdb.rst} | 74 +++++++++++---------- 3 files changed, 49 insertions(+), 42 deletions(-) rename source/leccion6/{depuracion.rst => pdb.rst} (84%) diff --git a/source/esquema.rst b/source/esquema.rst index 0c3cb9b..ae6c898 100644 --- a/source/esquema.rst +++ b/source/esquema.rst @@ -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 del módulo ``pdb`` y explorar el resultado en módulos a depurar. .. _esquema_entrenamiento_leccion7: diff --git a/source/leccion6/index.rst b/source/leccion6/index.rst index 809427b..b7faf82 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,7 @@ A continuación el temario de esta lección: .. toctree:: :maxdepth: 2 - depuracion + pdb ---- diff --git a/source/leccion6/depuracion.rst b/source/leccion6/pdb.rst similarity index 84% rename from source/leccion6/depuracion.rst rename to source/leccion6/pdb.rst index 9acbdb2..9d85f91 100644 --- a/source/leccion6/depuracion.rst +++ b/source/leccion6/pdb.rst @@ -45,9 +45,12 @@ Formas de lanzar el depurador: Postmortem ~~~~~~~~~~ -**Situación**: Estás trabajando en el interprete :ref:`ipython ` y obtienes un error (:ref:`traceback `). +**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. +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 @@ -94,12 +97,11 @@ En este caso esta depurando el archivo :download:`index_error.py <../../recursos In [3]: -.. topic:: Depuración post-mortem sin ipython +.. 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`: + 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 @@ -153,7 +155,7 @@ está haciendo correctamente. NOTE: Enter 'c' at the ipdb> prompt to start your script. > (1)() -* Coloca un *breakpoint* en la línea 34 usando ``b 34``: +* Coloca un ``breakpoint`` en la línea 34 usando ``b 34``: .. code-block:: pycon @@ -166,7 +168,7 @@ está haciendo correctamente. 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))``: +* Continua la ejecución hasta el siguiente ``breakpoint`` con ``c(ont(inue))``: .. code-block:: pycon @@ -216,7 +218,7 @@ está haciendo correctamente. ipdb> print(l_var.min()) 0 -*Oh dear*, solo ve entero y variación 0. Aquí está nuestro error, +*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 @@ -267,41 +269,47 @@ estamos haciendo aritmética con enteros. Otras formas de comenzar una depuración ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* **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() + * **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** + 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. - 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. +* **Depurando fallos de pruebas usando pytest** - 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*. + 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. -* **Llamando explícitamente al depurador** +* **Depurando interactivamente en la consola** - Inserta la siguiente línea donde quieres que salte el depurador: + `ipdb `_ exporta funciones para acceder al depurador + :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 ``pdb``. + Inserta la siguiente línea donde quieres que salte el depurador ``ipdb``: .. code-block:: python :linenos: - import pdb - - pdb.set_trace() - - -.. warning:: + import ipdb - 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``. + ipdb.set_trace() .. topic:: Depuradores gráficos y alternativas @@ -313,8 +321,6 @@ Otras formas de comenzar una depuración * 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 ...................................... From 46f2ed9a5c5447fbddba93db914b80efffd3dc9d Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 3 Apr 2025 19:11:31 +0200 Subject: [PATCH 05/43] Updated the leccion6 section --- recursos/leccion6/funcion_ipdb.py | 13 + source/esquema.rst | 2 +- source/leccion6/index.rst | 1 + source/leccion6/ipdb.rst | 503 ++++++++++++++++++++++++++++++ source/leccion6/pdb.rst | 253 ++++++++++----- 5 files changed, 686 insertions(+), 86 deletions(-) create mode 100644 recursos/leccion6/funcion_ipdb.py create mode 100644 source/leccion6/ipdb.rst 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/source/esquema.rst b/source/esquema.rst index ae6c898..ecf5240 100644 --- a/source/esquema.rst +++ b/source/esquema.rst @@ -77,7 +77,7 @@ Lección 6 - Introspección a la depuración de software **Descripción:** Conocer las capacidades de depuración de software que ofrece el lenguaje. -**Práctica:** Uso de uso del módulo ``pdb`` y explorar el resultado en módulos a depurar. +**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: diff --git a/source/leccion6/index.rst b/source/leccion6/index.rst index b7faf82..ec1f95e 100644 --- a/source/leccion6/index.rst +++ b/source/leccion6/index.rst @@ -15,6 +15,7 @@ A continuación el temario de esta lección: :maxdepth: 2 pdb + ipdb ---- diff --git a/source/leccion6/ipdb.rst b/source/leccion6/ipdb.rst new file mode 100644 index 0000000..6244964 --- /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. + +Si necesita instalar este módulo, ejecute el siguiente comando: + +.. tabs:: + + .. group-tab:: Linux + + .. 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:: Linux + + .. 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:`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_ipdb.py <../../recursos/leccion6/funcion_ipdb.py>` + usando la función ``set_trace()`` del módulo ``ipdb``. + + +.. tip:: + Para ejecutar el código :file:`index_error.py`, :file:`wiener_filtering.py` + y :file:`funcion_ipdb.py`, abra una consola de comando, acceda al directorio + donde se encuentra ambos programas: + + .. code-block:: console + :class: no-copy + + depuracion/ + ├── index_error.py + ├── wiener_filtering.py + └── funcion_ipdb.py + + Si tiene la estructura de archivo previa, entonces ejecute por separado cada comando: + + .. code-block:: console + + ipdb3 index_error.py + + .. code-block:: console + + python3 -m ipdb wiener_filtering.py + + .. code-block:: console + + python3 funcion_ipdb.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 index 9d85f91..df34792 100644 --- a/source/leccion6/pdb.rst +++ b/source/leccion6/pdb.rst @@ -6,7 +6,7 @@ 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 `_, +El depurador Python, `pdb `_, te permite inspeccionar tu código de forma interactiva. Te permite: @@ -48,46 +48,57 @@ 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. +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) - /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__': + 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(5)index_error() - 4 lst = list('foobar') - ----> 5 print(lst[len(lst)]) - 6 + > /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 def index_error(): - 4 lst = list('foobar') - ----> 5 print(lst[len(lst)]) - 6 - 7 if __name__ == '__main__': - 8 index_error() - 9 + 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 @@ -109,30 +120,33 @@ Escribe ``%debug`` y entrarás en el depurador. 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 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 + 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 "index_error.py", line 5, 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(5)index_error() + > /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 ~~~~~~~~~~~~~~~~~~~~~ @@ -143,7 +157,7 @@ Por ejemplo, esta intentado depurar :download:`wiener_filtering.py <../../recurs 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`: +* Ejecuta el `script` en :ref:`IPython ` con el depurador usando :command:`%run -d wiener_filtering.py`: .. code-block:: pycon @@ -227,6 +241,7 @@ estamos haciendo aritmética con enteros. 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 @@ -237,6 +252,7 @@ estamos haciendo aritmética con enteros. 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'} @@ -265,21 +281,58 @@ estamos haciendo aritmética con enteros. 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. -Otras formas de comenzar una depuración -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* **Llamando explícitamente al depurador** +Lanza al depurador desde adentro +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Inserta la siguiente línea donde quieres que salte el depurador: +Puedes llamar explícitamente al depurador desde adentro. Inserta la siguiente línea +donde quieres que salte el depurador: - .. code-block:: python +.. 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 @@ -299,17 +352,7 @@ Otras formas de comenzar una depuración * **Depurando interactivamente en la consola** - `ipdb `_ exporta funciones para acceder al depurador - :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 ``pdb``. - Inserta la siguiente línea donde quieres que salte el depurador ``ipdb``: - - .. code-block:: python - :linenos: - - import ipdb - - ipdb.set_trace() + Consulte el módulo :ref:`ipdb `. .. topic:: Depuradores gráficos y alternativas @@ -322,19 +365,59 @@ Otras formas de comenzar una depuración buen depurador semi-gráfico con una interfaz de texto en la consola. -Comandos del depurador e interacciones -...................................... +.. _python_modulo_pdb_comandos: -============ ====================================================================== -``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) -============ ====================================================================== +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** @@ -343,33 +426,32 @@ Comandos del depurador e interacciones 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 -..................................... + +.. _python_modulo_pdb_ayuda: + +Ayuda del depurador +................... Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: .. sourcecode:: pycon - ipdb> help + (Pdb) 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 + 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 - Undocumented commands: - ====================== - retval rv - - ---- @@ -391,9 +473,10 @@ Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: y :file:`funcion_a_depurar.py`, abra una consola de comando, acceda al directorio donde se encuentra ambos programas: - :: + .. code-block:: console + :class: no-copy - leccion6/ + depuracion/ ├── index_error.py ├── wiener_filtering.py └── funcion_a_depurar.py @@ -402,11 +485,11 @@ Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: .. code-block:: console - python3 index_error.py + pdb3 index_error.py .. code-block:: console - python3 wiener_filtering.py + python3 -m pdb wiener_filtering.py .. code-block:: console From 456c4cd4f45c5fb2d4890e7c41cbf7231b942a3d Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 3 Apr 2025 19:12:22 +0200 Subject: [PATCH 06/43] Updated the ipython section --- source/leccion2/ipython.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/leccion2/ipython.rst b/source/leccion2/ipython.rst index db0671f..7a3fa40 100644 --- a/source/leccion2/ipython.rst +++ b/source/leccion2/ipython.rst @@ -14,8 +14,10 @@ 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`_. + +Si necesita instalar este módulo, ejecute el siguiente comando: .. tabs:: From 588930de693557b0cf041c95e31271e65953a656 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 3 Apr 2025 19:19:05 +0200 Subject: [PATCH 07/43] Updated the modulos section --- source/leccion8/modulos.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source/leccion8/modulos.rst b/source/leccion8/modulos.rst index a51cde8..4af2a41 100644 --- a/source/leccion8/modulos.rst +++ b/source/leccion8/modulos.rst @@ -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: @@ -194,11 +195,12 @@ sentencia ``global``, se soluciona el problema. 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: From d75393b08006cd268fd08c4141de0ce1fa5b2355 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Thu, 3 Apr 2025 19:28:50 +0200 Subject: [PATCH 08/43] Updated the leccion6 section --- source/leccion6/ipdb.rst | 20 +++++++++----------- source/leccion6/pdb.rst | 24 +++++++++++------------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/source/leccion6/ipdb.rst b/source/leccion6/ipdb.rst index 6244964..5e8f1c2 100644 --- a/source/leccion6/ipdb.rst +++ b/source/leccion6/ipdb.rst @@ -447,41 +447,39 @@ Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: 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>`. - Adicional se incluye otro código de ejemplo muy simple - :download:`funcion_ipdb.py <../../recursos/leccion6/funcion_ipdb.py>` - usando la función ``set_trace()`` del módulo ``ipdb``. - .. tip:: - Para ejecutar el código :file:`index_error.py`, :file:`wiener_filtering.py` - y :file:`funcion_ipdb.py`, abra una consola de comando, acceda al directorio + 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 - └── funcion_ipdb.py + └── wiener_filtering.py Si tiene la estructura de archivo previa, entonces ejecute por separado cada comando: .. code-block:: console - ipdb3 index_error.py + python3 funcion_ipdb.py .. code-block:: console - python3 -m ipdb wiener_filtering.py + ipdb3 index_error.py .. code-block:: console - python3 funcion_ipdb.py + python3 -m ipdb wiener_filtering.py ---- diff --git a/source/leccion6/pdb.rst b/source/leccion6/pdb.rst index df34792..90ecb68 100644 --- a/source/leccion6/pdb.rst +++ b/source/leccion6/pdb.rst @@ -6,8 +6,8 @@ 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. +El depurador Python, :mod:`pdb`, te permite inspeccionar tu código +de forma interactiva. Te permite: @@ -459,41 +459,39 @@ Teclea ``h`` o ``help`` para acceder a la ayuda interactiva: 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>`. - 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 + 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 - └── funcion_a_depurar.py + └── wiener_filtering.py Si tiene la estructura de archivo previa, entonces ejecute por separado cada comando: .. code-block:: console - pdb3 index_error.py + python3 funcion_a_depurar.py .. code-block:: console - python3 -m pdb wiener_filtering.py + pdb3 index_error.py .. code-block:: console - python3 funcion_a_depurar.py + python3 -m pdb wiener_filtering.py ---- From 851bff178a31b0e83e689791c245f329139c6fdd Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 00:36:18 +0200 Subject: [PATCH 09/43] Updated the lecturas section --- source/lecturas.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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*. From dad0b8799a8259b6e7687c31f28eee447354ee7f Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 00:41:55 +0200 Subject: [PATCH 10/43] Added :mod: referencies --- source/esquema.rst | 2 +- source/leccion10/datetime.rst | 8 +- source/leccion10/email.rst | 13 +-- source/leccion10/json.rst | 8 +- source/leccion10/libreria_estandar.rst | 101 +++++-------------- source/leccion10/locale.rst | 9 +- source/leccion2/interactivo.rst | 6 +- source/leccion2/ipython.rst | 12 +-- source/leccion5/decoradores.rst | 1 - source/leccion5/funciones_orden_superior.rst | 6 +- source/leccion7/archivos.rst | 12 +-- source/leccion8/distribucion.rst | 2 +- source/leccion8/distribucion_nativa.rst | 5 +- source/leccion9/clases_integradas.rst | 10 +- source/leccion9/errores.rst | 8 +- 15 files changed, 70 insertions(+), 133 deletions(-) diff --git a/source/esquema.rst b/source/esquema.rst index ecf5240..e8c60aa 100644 --- a/source/esquema.rst +++ b/source/esquema.rst @@ -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/leccion10/datetime.rst b/source/leccion10/datetime.rst index 4239614..4b5add3 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 @@ -29,7 +29,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. @@ -54,7 +54,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 @@ -133,5 +133,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 a1cb2b1..056ba22 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 @@ -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..882263a 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`, :mod:`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,3 @@ 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 diff --git a/source/leccion10/locale.rst b/source/leccion10/locale.rst index 6d0664b..0b38300 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 @@ -28,7 +28,7 @@ El anterior código al ejecutar debe mostrar el siguiente mensaje: miércoles, 03. diciembre 1980 12:00am -Jugando con el módulo ``locale`` en el interprete :ref:`ipython `: +Jugando con el módulo :mod:`locale` en el interprete :ref:`ipython `: .. code-block:: pycon @@ -245,5 +245,4 @@ Jugando con el módulo ``locale`` en el interprete :ref:`ipython >> -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 7a3fa40..299040e 100644 --- a/source/leccion2/ipython.rst +++ b/source/leccion2/ipython.rst @@ -109,7 +109,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 @@ -117,7 +117,7 @@ De nuevo realice la importación de la :ref:`librería del estándar Python `_ 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* @@ -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 @@ -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`. ---- @@ -532,5 +531,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..6530542 100644 --- a/source/leccion8/distribucion.rst +++ b/source/leccion8/distribucion.rst @@ -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. diff --git a/source/leccion8/distribucion_nativa.rst b/source/leccion8/distribucion_nativa.rst index b2b2f44..138da5d 100644 --- a/source/leccion8/distribucion_nativa.rst +++ b/source/leccion8/distribucion_nativa.rst @@ -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/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 From 8546bd93c7eb265d7b30dbb868c5ba13462c4931 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 11:20:27 +0200 Subject: [PATCH 11/43] Updated the download sections --- source/leccion10/listas_comprension.rst | 7 +++++-- source/leccion3/operadores_aritmeticos.rst | 1 - source/leccion3/operadores_asignaciones.rst | 1 - source/leccion3/operadores_relacionales.rst | 1 - source/leccion3/tipo_booleanos.rst | 1 - source/leccion3/tipo_cadenas.rst | 1 - source/leccion3/tipo_conjuntos.rst | 1 - source/leccion3/tipo_diccionarios.rst | 1 - source/leccion3/tipo_listas.rst | 1 - source/leccion3/tipo_numericos.rst | 1 - source/leccion3/tipo_tuplas.rst | 1 - source/leccion3/variables_constantes.rst | 1 - source/leccion4/condicional_if.rst | 6 ++++-- source/leccion4/operadores_identidad.rst | 6 ++++-- source/leccion4/operadores_logicos.rst | 6 ++++-- source/leccion4/operadores_pertenencia.rst | 6 ++++-- source/leccion5/funciones.rst | 6 ++++-- source/leccion7/archivos.rst | 18 ++++++++++-------- source/leccion8/distribucion.rst | 4 +++- source/leccion9/herencia.rst | 14 ++++++++++---- source/leccion9/poo.rst | 6 ++++-- 21 files changed, 52 insertions(+), 38 deletions(-) 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/leccion3/operadores_aritmeticos.rst b/source/leccion3/operadores_aritmeticos.rst index 69ed1c4..3cc3f22 100644 --- a/source/leccion3/operadores_aritmeticos.rst +++ b/source/leccion3/operadores_aritmeticos.rst @@ -250,7 +250,6 @@ por el operador del lado derecho y devuelve el resto. Usted puede descargar el código usado en esta sección haciendo clic en el siguiente enlace: - - :download:`operadores_aritmeticos.py <../../recursos/leccion3/operadores_aritmeticos.py>`. 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..23bc919 100644 --- a/source/leccion3/variables_constantes.rst +++ b/source/leccion3/variables_constantes.rst @@ -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/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/leccion7/archivos.rst b/source/leccion7/archivos.rst index 87061b8..4eeb29c 100644 --- a/source/leccion7/archivos.rst +++ b/source/leccion7/archivos.rst @@ -223,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>`. @@ -331,8 +331,8 @@ integrado en Python llamado :mod:`csv`, el cual se implementa para operaciones d :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>`. @@ -438,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>`. @@ -503,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:: diff --git a/source/leccion8/distribucion.rst b/source/leccion8/distribucion.rst index 6530542..caa37e3 100644 --- a/source/leccion8/distribucion.rst +++ b/source/leccion8/distribucion.rst @@ -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/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/poo.rst b/source/leccion9/poo.rst index 076b866..b9f482843 100644 --- a/source/leccion9/poo.rst +++ b/source/leccion9/poo.rst @@ -560,8 +560,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:: From 389296073542eea8ccfd2424013291d1847cc4d2 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 11:22:09 +0200 Subject: [PATCH 12/43] Added the no-copy CSS attributes class --- source/leccion9/poo.rst | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/source/leccion9/poo.rst b/source/leccion9/poo.rst index b9f482843..0194cbb 100644 --- a/source/leccion9/poo.rst +++ b/source/leccion9/poo.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""" @@ -242,6 +243,7 @@ especiales. - __name__, describe el nombre del objeto o del método. .. code-block:: pycon + :class: no-copy >>> macagua.__name__ 'Persona' @@ -250,6 +252,7 @@ especiales. escrita en el formato :ref:`docstrings `. .. code-block:: pycon + :class: no-copy >>> macagua.__doc__ 'Clase que representa una Persona' @@ -258,6 +261,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' @@ -304,6 +308,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 +326,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()) @@ -424,7 +430,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 +457,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 : ... From d6f0c393ec415791e16dd2b1c77f9181a1ca7a34 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 11:22:56 +0200 Subject: [PATCH 13/43] Updated the poo section --- source/leccion9/poo.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/leccion9/poo.rst b/source/leccion9/poo.rst index 0194cbb..ce84940 100644 --- a/source/leccion9/poo.rst +++ b/source/leccion9/poo.rst @@ -299,7 +299,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``. From a86b33d241fa7bdcd14849229bec94a8b4ca8798 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 11:56:47 +0200 Subject: [PATCH 14/43] Updated the repo_name settings --- source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/conf.py b/source/conf.py index 3133d9a..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 From ef7093255e705b72d701c89c5b62ee107d270665 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 12:04:52 +0200 Subject: [PATCH 15/43] Updated the poo section --- source/leccion9/poo.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/source/leccion9/poo.rst b/source/leccion9/poo.rst index ce84940..1e49e33 100644 --- a/source/leccion9/poo.rst +++ b/source/leccion9/poo.rst @@ -227,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'. @@ -338,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.' >>> From 2a1651caa05f845068f98066aa79e6ddfbaf4e82 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 12:14:11 +0200 Subject: [PATCH 16/43] Updated the IDLE link --- source/leccion10/libreria_estandar.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/leccion10/libreria_estandar.rst b/source/leccion10/libreria_estandar.rst index 882263a..7ae5144 100644 --- a/source/leccion10/libreria_estandar.rst +++ b/source/leccion10/libreria_estandar.rst @@ -47,7 +47,7 @@ La `librería estándar`_ Python 3 incluye los siguientes módulos y librerías: - Program Frameworks, incluye las librerías :mod:`cmd` y :mod:`shlex`. -- Interfaces gráficas de usuario con Tk, incluye 7 librerías, como :mod:`tkinter`, :mod:`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 :mod:`unittest`, :mod:`test` y otros. @@ -93,3 +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 +.. _`IDLE`: https://docs.python.org/es/3.11/library/idle.html#idle From 670b529e15e343299c5a9bc34adc2c04fe7805a5 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 17:07:15 +0200 Subject: [PATCH 17/43] Added the programacion_modular section --- .../modulos/calculadora/calculo_resta.py | 6 + .../modulos/calculadora/calculo_suma.py | 6 + .../calculadora/calculos_matematicos.py | 17 ++ .../modulos/calculadora/operaciones.py | 16 ++ source/leccion8/index.rst | 1 + source/leccion8/programacion_modular.rst | 194 ++++++++++++++++++ 6 files changed, 240 insertions(+) create mode 100644 recursos/leccion8/modulos/calculadora/calculo_resta.py create mode 100644 recursos/leccion8/modulos/calculadora/calculo_suma.py create mode 100644 recursos/leccion8/modulos/calculadora/calculos_matematicos.py create mode 100644 recursos/leccion8/modulos/calculadora/operaciones.py create mode 100644 source/leccion8/programacion_modular.rst 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..4bb0d16 --- /dev/null +++ b/recursos/leccion8/modulos/calculadora/calculos_matematicos.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. + """ + 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..33cac80 --- /dev/null +++ b/recursos/leccion8/modulos/calculadora/operaciones.py @@ -0,0 +1,16 @@ +"""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/source/leccion8/index.rst b/source/leccion8/index.rst index f801c2b..f0ef972 100644 --- a/source/leccion8/index.rst +++ b/source/leccion8/index.rst @@ -15,6 +15,7 @@ A continuación el temario de esta lección: .. toctree:: :maxdepth: 2 + programacion_modular modulos paquetes distribucion diff --git a/source/leccion8/programacion_modular.rst b/source/leccion8/programacion_modular.rst new file mode 100644 index 0000000..c0e4161 --- /dev/null +++ b/source/leccion8/programacion_modular.rst @@ -0,0 +1,194 @@ +.. _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. + + +Cómo utilizarlo +............... + +Para utilizar la programación modular en Python, se pueden seguir los siguientes pasos: + + +**1) 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 + >>> + +**2) 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-17 + +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-16 + + +.. 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 `. + + +**3) 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:: From 34d380efb888f267b05965c9e67b81abe34d42cc Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 17:09:16 +0200 Subject: [PATCH 18/43] Updated the poo section --- source/leccion9/poo.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/leccion9/poo.rst b/source/leccion9/poo.rst index 1e49e33..4aff612 100644 --- a/source/leccion9/poo.rst +++ b/source/leccion9/poo.rst @@ -246,7 +246,7 @@ especiales. >>> 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 @@ -283,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 From 6b8ec4f7ee3b65ccb70668fa0b5c68427b485a84 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 17:14:17 +0200 Subject: [PATCH 19/43] Renamed the poo section --- source/leccion9/index.rst | 2 +- source/leccion9/{poo.rst => programacion_orientada_objetos.rst} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename source/leccion9/{poo.rst => programacion_orientada_objetos.rst} (100%) 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 100% rename from source/leccion9/poo.rst rename to source/leccion9/programacion_orientada_objetos.rst From c1de33ba3a01cc68107880095c216456150bfa5b Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 17:15:18 +0200 Subject: [PATCH 20/43] Updated the leccion8 section --- recursos/leccion8/modulos/calculadora/calculos_matematicos.py | 2 ++ recursos/leccion8/modulos/calculadora/operaciones.py | 1 + source/leccion8/programacion_modular.rst | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/recursos/leccion8/modulos/calculadora/calculos_matematicos.py b/recursos/leccion8/modulos/calculadora/calculos_matematicos.py index 4bb0d16..fbdd7a7 100644 --- a/recursos/leccion8/modulos/calculadora/calculos_matematicos.py +++ b/recursos/leccion8/modulos/calculadora/calculos_matematicos.py @@ -1,5 +1,6 @@ """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. @@ -13,5 +14,6 @@ def resta(a, b): """ 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 index 33cac80..d61e193 100644 --- a/recursos/leccion8/modulos/calculadora/operaciones.py +++ b/recursos/leccion8/modulos/calculadora/operaciones.py @@ -1,5 +1,6 @@ """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. diff --git a/source/leccion8/programacion_modular.rst b/source/leccion8/programacion_modular.rst index c0e4161..c5558b5 100644 --- a/source/leccion8/programacion_modular.rst +++ b/source/leccion8/programacion_modular.rst @@ -54,7 +54,7 @@ codigo fuente: .. literalinclude:: ../../recursos/leccion8/modulos/calculadora/calculos_matematicos.py :language: python :linenos: - :lines: 1-17 + :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: @@ -78,7 +78,7 @@ propone separar las funciones genericas en un módulo separado, por ejemplo, un .. literalinclude:: ../../recursos/leccion8/modulos/calculadora/operaciones.py :language: python :linenos: - :lines: 1-16 + :lines: 1-17 .. tip:: From 92861545553b305defda7f66303af8b52a709138 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 17:19:55 +0200 Subject: [PATCH 21/43] Updated the programacion_orientada_objetos section --- source/leccion9/programacion_orientada_objetos.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/leccion9/programacion_orientada_objetos.rst b/source/leccion9/programacion_orientada_objetos.rst index 4aff612..e4c7cac 100644 --- a/source/leccion9/programacion_orientada_objetos.rst +++ b/source/leccion9/programacion_orientada_objetos.rst @@ -581,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 ` From 56ea93b55c7463893da0fc5d18c7e414de4d272b Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 17:35:09 +0200 Subject: [PATCH 22/43] Updated the modulos section --- .../leccion8/modulos/{ => pipo}/calculo_factura_pipo.py | 0 recursos/leccion8/modulos/{ => pipo}/utilidades.py | 0 source/leccion8/modulos.rst | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) rename recursos/leccion8/modulos/{ => pipo}/calculo_factura_pipo.py (100%) rename recursos/leccion8/modulos/{ => pipo}/utilidades.py (100%) 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/leccion8/modulos.rst b/source/leccion8/modulos.rst index 4af2a41..e4b16e5 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 @@ -186,9 +186,9 @@ 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:: From 96bba67e4f88f3ff2024ed11ce44cc172be2eb80 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Fri, 4 Apr 2025 17:36:12 +0200 Subject: [PATCH 23/43] Updated the programacion_modular section --- source/leccion8/programacion_modular.rst | 104 +++++++++++------------ 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/source/leccion8/programacion_modular.rst b/source/leccion8/programacion_modular.rst index c5558b5..4650ee9 100644 --- a/source/leccion8/programacion_modular.rst +++ b/source/leccion8/programacion_modular.rst @@ -28,88 +28,86 @@ Características que luego se integran en un proyecto mayor. -Cómo utilizarlo -............... - -Para utilizar la programación modular en Python, se pueden seguir los siguientes pasos: +Práctica - Caso real +.................... +A continuación se presenta una práctica más real de implementar la *programación modular* en Python: -**1) Uso de módulos de la librería estándar** +* **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 `: + 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 + .. code-block:: pycon - >>> import math - >>> print(math.sqrt(25)) # Calcula la raíz cuadrada de 25 - 5.0 - >>> + >>> import math + >>> print(math.sqrt(25)) # Calcula la raíz cuadrada de 25 + 5.0 + >>> -**2) Creación de un módulo en Python** +#. **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: + 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 + .. 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: + 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 + .. code-block:: console - python3 calculos_matematicos.py + python3 calculos_matematicos.py -El anterior código al ejecutar debe mostrar el siguiente mensaje: + El anterior código al ejecutar debe mostrar el siguiente mensaje: -:: + :: - La suma es: 15 - La resta es: 5 + 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: + 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 + .. 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 `. + .. 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 `. -**3) 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: +#. **Importar una función en otro módulo** -.. 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 ``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 + 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. + De esta manera, usted puede reutilizar el código de :file:`operaciones.py` en otros módulos Python. .. important:: From a01c9f0590be4d031ead9b48551d172df8278c91 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sat, 5 Apr 2025 21:35:39 +0200 Subject: [PATCH 24/43] Added the :command: reference --- source/leccion1/instalacion.rst | 2 +- source/leccion2/bpython.rst | 2 +- source/leccion2/interactivo.rst | 2 +- source/leccion2/ipython.rst | 2 +- source/leccion3/variables_constantes.rst | 2 +- source/leccion8/distribucion.rst | 6 +++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/leccion1/instalacion.rst b/source/leccion1/instalacion.rst index 34ea3d4..7523006 100644 --- a/source/leccion1/instalacion.rst +++ b/source/leccion1/instalacion.rst @@ -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/leccion2/bpython.rst b/source/leccion2/bpython.rst index 7567d81..0d6c65a 100644 --- a/source/leccion2/bpython.rst +++ b/source/leccion2/bpython.rst @@ -25,7 +25,7 @@ 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: diff --git a/source/leccion2/interactivo.rst b/source/leccion2/interactivo.rst index 6e48da9..6222375 100644 --- a/source/leccion2/interactivo.rst +++ b/source/leccion2/interactivo.rst @@ -43,7 +43,7 @@ factores: 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 diff --git a/source/leccion2/ipython.rst b/source/leccion2/ipython.rst index 299040e..8bdb124 100644 --- a/source/leccion2/ipython.rst +++ b/source/leccion2/ipython.rst @@ -78,7 +78,7 @@ Sustituya el comando :command:`python3` por el comando :command:`ipython3` de la 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 diff --git a/source/leccion3/variables_constantes.rst b/source/leccion3/variables_constantes.rst index 23bc919..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:: diff --git a/source/leccion8/distribucion.rst b/source/leccion8/distribucion.rst index caa37e3..f936344 100644 --- a/source/leccion8/distribucion.rst +++ b/source/leccion8/distribucion.rst @@ -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`. ---- @@ -837,7 +837,7 @@ conocidas son: cuales fueron instalados sin la herramienta ``pip`` usando el comando ``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. @@ -848,7 +848,7 @@ conocidas son: 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. From a9c9152ced09d03e8ab493010fe64068d7f1edef Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sat, 5 Apr 2025 21:36:43 +0200 Subject: [PATCH 25/43] Added the :command: reference --- source/glosario.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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``. From 827a7c2c2277381b4f26e625dc1ce21f4cb7e31f Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sat, 5 Apr 2025 21:38:02 +0200 Subject: [PATCH 26/43] Fixed some typos --- source/leccion1/holamundo.rst | 2 +- source/leccion1/instalacion.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/leccion1/holamundo.rst b/source/leccion1/holamundo.rst index 9f2853e..df4dacc 100644 --- a/source/leccion1/holamundo.rst +++ b/source/leccion1/holamundo.rst @@ -130,7 +130,7 @@ Cree un directorio llamado ``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 diff --git a/source/leccion1/instalacion.rst b/source/leccion1/instalacion.rst index 7523006..e23840a 100644 --- a/source/leccion1/instalacion.rst +++ b/source/leccion1/instalacion.rst @@ -29,7 +29,7 @@ Instalando Python en un 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 From 073b1f1e2c304bfc7423f8b302ee9709ecfcdad0 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sat, 5 Apr 2025 21:40:45 +0200 Subject: [PATCH 27/43] Added the pip apendices section --- recursos/apendices/pip/requirements.txt | 22 +++ source/apendices/pip.rst | 216 ++++++++++++++++++++++++ source/leccion8/distribucion.rst | 22 +-- 3 files changed, 249 insertions(+), 11 deletions(-) create mode 100644 recursos/apendices/pip/requirements.txt create mode 100644 source/apendices/pip.rst 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/source/apendices/pip.rst b/source/apendices/pip.rst new file mode 100644 index 0000000..d428c79 --- /dev/null +++ b/source/apendices/pip.rst @@ -0,0 +1,216 @@ +.. _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 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/leccion8/distribucion.rst b/source/leccion8/distribucion.rst index f936344..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: @@ -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 `. ---- @@ -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,18 +830,18 @@ 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 :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:: From fef6a46f87639eff7dc0aa65dcc2277a565496d2 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sat, 5 Apr 2025 21:41:40 +0200 Subject: [PATCH 28/43] Added the entornos_virtuales apendices section --- source/apendices/entornos_virtuales.rst | 103 ++++++++++++++++++++++++ source/index.rst | 2 + 2 files changed, 105 insertions(+) create mode 100644 source/apendices/entornos_virtuales.rst diff --git a/source/apendices/entornos_virtuales.rst b/source/apendices/entornos_virtuales.rst new file mode 100644 index 0000000..452ac96 --- /dev/null +++ b/source/apendices/entornos_virtuales.rst @@ -0,0 +1,103 @@ +.. _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 la instalación de la herramienta de entornos virtuales en Python, +ejecute el siguiente comando: + +.. tabs:: + + .. group-tab:: PIP + + .. code-block:: console + + pip3 install virtualenv + + .. group-tab:: Ubuntu/Debian Linux + + .. code-block:: console + + sudo apt install -y python3-virtualenv + +Cree un directorio raíz para almacenar los diversos entornos virtuales, +ejecutando el siguiente comando: + +.. code-block:: console + + mkdir ~/virtualenv && cd $_ + +Cree un entorno virtual llamado :command:`python3`, ejecutando el siguiente comando: + +.. code-block:: console + + virtualenv --python /usr/bin/python3 python3 + +Activar el entorno virtual llamado :command:`python3`, ejecutando el siguiente comando: + +.. code-block:: console + + source ~/virtualenv/python3/bin/activate + +Para desactivar entorno virtual creado, con el siguiente comando: + +.. 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/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 From b46035b6013f4e884cdd102d8d959d4a3c6bf127 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sat, 5 Apr 2025 21:42:26 +0200 Subject: [PATCH 29/43] Updated the decoradores section --- source/leccion5/decoradores.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/leccion5/decoradores.rst b/source/leccion5/decoradores.rst index 5950469..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:** From af32614165606aac510139e88af15705686bfbce Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sat, 5 Apr 2025 23:47:41 +0200 Subject: [PATCH 30/43] Updated the group-tab for Linux --- source/apendices/entornos_virtuales.rst | 8 ++++---- source/leccion10/json.rst | 2 +- source/leccion2/bpython.rst | 2 +- source/leccion2/ipython.rst | 10 +++++----- source/leccion6/ipdb.rst | 4 ++-- source/leccion8/distribucion_nativa.rst | 2 +- source/leccion8/modulos.rst | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/source/apendices/entornos_virtuales.rst b/source/apendices/entornos_virtuales.rst index 452ac96..5480cba 100644 --- a/source/apendices/entornos_virtuales.rst +++ b/source/apendices/entornos_virtuales.rst @@ -15,17 +15,17 @@ ejecute el siguiente comando: .. tabs:: - .. group-tab:: PIP + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console - pip3 install virtualenv + sudo apt install -y python3-virtualenv - .. group-tab:: Ubuntu/Debian Linux + .. group-tab:: Windows .. code-block:: console - sudo apt install -y python3-virtualenv + pip3 install virtualenv Cree un directorio raíz para almacenar los diversos entornos virtuales, ejecutando el siguiente comando: diff --git a/source/leccion10/json.rst b/source/leccion10/json.rst index 056ba22..c281c0a 100644 --- a/source/leccion10/json.rst +++ b/source/leccion10/json.rst @@ -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: diff --git a/source/leccion2/bpython.rst b/source/leccion2/bpython.rst index 0d6c65a..f95d6d4 100644 --- a/source/leccion2/bpython.rst +++ b/source/leccion2/bpython.rst @@ -12,7 +12,7 @@ el correspondiente comando de tu sistema operativo: .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console diff --git a/source/leccion2/ipython.rst b/source/leccion2/ipython.rst index 8bdb124..a42e716 100644 --- a/source/leccion2/ipython.rst +++ b/source/leccion2/ipython.rst @@ -21,17 +21,17 @@ Si necesita instalar este módulo, ejecute el siguiente comando: .. 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 @@ -43,7 +43,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 diff --git a/source/leccion6/ipdb.rst b/source/leccion6/ipdb.rst index 5e8f1c2..2e9f7c8 100644 --- a/source/leccion6/ipdb.rst +++ b/source/leccion6/ipdb.rst @@ -13,7 +13,7 @@ Si necesita instalar este módulo, ejecute el siguiente comando: .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console @@ -30,7 +30,7 @@ comando correspondiente a tu sistema operativo: .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console diff --git a/source/leccion8/distribucion_nativa.rst b/source/leccion8/distribucion_nativa.rst index 138da5d..3ac21c1 100644 --- a/source/leccion8/distribucion_nativa.rst +++ b/source/leccion8/distribucion_nativa.rst @@ -129,7 +129,7 @@ de tu sistema operativo: .. tabs:: - .. group-tab:: Linux + .. group-tab:: macOS, Linux, y Windows con WSL .. code-block:: console diff --git a/source/leccion8/modulos.rst b/source/leccion8/modulos.rst index e4b16e5..8ee18bb 100644 --- a/source/leccion8/modulos.rst +++ b/source/leccion8/modulos.rst @@ -119,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: From 8844b3c2de5697c6192a062cc594e8431c61519e Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 02:08:21 +0200 Subject: [PATCH 31/43] Updated the locale section --- source/leccion10/locale.rst | 214 +++++++++--------------------------- 1 file changed, 50 insertions(+), 164 deletions(-) diff --git a/source/leccion10/locale.rst b/source/leccion10/locale.rst index 0b38300..ae67cff 100644 --- a/source/leccion10/locale.rst +++ b/source/leccion10/locale.rst @@ -22,181 +22,61 @@ Uso del módulo :mod:`locale`: :linenos: :lines: 1-27 -El anterior código al ejecutar debe mostrar el siguiente mensaje: - -.. code-block:: console - - miércoles, 03. diciembre 1980 12:00am - Jugando con el módulo :mod:`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 :mod:`locale` en el interprete :ref:`ipython Date: Sun, 6 Apr 2025 02:08:59 +0200 Subject: [PATCH 32/43] Updated the datetime section --- source/leccion10/datetime.rst | 45 +++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/source/leccion10/datetime.rst b/source/leccion10/datetime.rst index 4b5add3..a36a633 100644 --- a/source/leccion10/datetime.rst +++ b/source/leccion10/datetime.rst @@ -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: @@ -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: @@ -62,12 +50,6 @@ El método de clase ``datetime.strptime()`` crea un objeto :mod:`datetime` a par :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. + ---- From ed8b2f00acaa4fe1d5daa1caf9cf2acc5d3e90e9 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 02:10:32 +0200 Subject: [PATCH 33/43] Updated the leccion8 section --- source/leccion8/index.rst | 1 + source/leccion8/pastescript.rst | 273 +++++++++++++++++++++++ source/leccion8/scaffolding.rst | 374 +++++++++++++++----------------- 3 files changed, 451 insertions(+), 197 deletions(-) create mode 100644 source/leccion8/pastescript.rst diff --git a/source/leccion8/index.rst b/source/leccion8/index.rst index f0ef972..e3839e0 100644 --- a/source/leccion8/index.rst +++ b/source/leccion8/index.rst @@ -21,6 +21,7 @@ A continuación el temario de esta lección: distribucion distribucion_nativa scaffolding + pastescript ---- diff --git a/source/leccion8/pastescript.rst b/source/leccion8/pastescript.rst new file mode 100644 index 0000000..b3484c0 --- /dev/null +++ b/source/leccion8/pastescript.rst @@ -0,0 +1,273 @@ +.. _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 +~~~~~~~~~~~ + +Dentro de su `entorno virtual`_ activado debe instalar el paquete `PasteScript`_, +ejecutando el siguiente comando: + +.. 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/scaffolding.rst b/source/leccion8/scaffolding.rst index 88a8724..2b2da64 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,232 @@ 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? -.................... +¿Por qué usar Scaffolding? +.......................... -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`_. +- Ahorra tiempo al generar estructuras comunes. +- Facilita buenas prácticas de arquitectura. -Instalación -~~~~~~~~~~~ +- Mejora la organización del proyecto. -Dentro de su `entorno virtual`_ activado debe instalar el paquete `PasteScript`_, -ejecutando el siguiente comando: +- Acelera el inicio del desarrollo en frameworks web o CLI. -.. code-block:: console +---- - pip install PasteScript +Herramientas comunes de Scaffolding en Python +............................................. + ++-----------------------------+--------------------------------------------+----------------------+ +| 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 `. | | ++-----------------------------+--------------------------------------------+----------------------+ -.. 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/` +🛠️ Ejemplo 1: Usar `cookiecutter` para crear un proyecto Python +................................................................ -Al finalizar la instalación podrá opcionalmente consultar cuales plantillas -tiene disponible para usa, ejecutando el siguiente comando: +`cookiecutter`_, ofrece varias plantillas para cualquier tipo de proyecto. -.. code-block:: console +Paso 1: Instalar cookiecutter +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - paster create --list-templates +Para instalar ``cookiecutter``, puedes usar :ref:`pip ` ejecute con el siguiente comando: .. code-block:: console - Available templates: - basic_package: A basic setuptools-enabled package - paste_deploy: A web application deployed through paste.deploy + pip install cookiecutter -Usted puede usar el comando :command:`paster` para crear paquetes Python. -.. code-block:: console +Paso 2: Ejecutar una plantilla pública +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - paster create -t basic_package mipaquetepython +`cookiecutter-pypackage`_, es una plantilla ``cookiecutter`` para un paquete Python. .. code-block:: console - 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 + cookiecutter https://github.com/audreyfeldroy/cookiecutter-pypackage - tree mipaquetepython/ -.. code-block:: console +Paso 3: Responder preguntas +~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 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: +El generador te preguntará: .. code-block:: console - - cd mipaquetepython/mipaquetepython/ + :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 - vim 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 importe su aplicación -:file:`app.py` en el archivo :file:`__init__.py` con el siguiente código fuente: +🛠️ Ejemplo 2: Scaffolding con Django +..................................... -.. code-block:: python - :linenos: +Por defecto, :ref:`Django ` incluye un comando para crear un nuevo proyecto. - from mipaquetepython import app +Paso 1: Instalar Django +~~~~~~~~~~~~~~~~~~~~~~~ -Para comprobar su instalación ejecute el siguiente comando: +Para instalar :ref:`Django `, puedes usar :ref:`pip ` ejecute con el siguiente comando: .. code-block:: console - python3 + pip3 install Django -Y realice una importación del paquete ``mipaquetepython`` ejecutando -el siguiente comando: -.. code-block:: pycon +Paso 2: Crear proyecto +~~~~~~~~~~~~~~~~~~~~~~ - >>> import mipaquetepython - Introduzca alguna frase: Esta cadena - Usted introdujo: Esta cadena - >>> exit() +Para crear un nuevo proyecto :ref:`Django `, ejecuta el siguiente comando: -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. +.. code-block:: console - - `django-project-templates`_, plantillas Paster para crear proyectos - Django. + django-admin startproject mi_sitio && cd mi_sitio - - `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. +Paso 3: Crear una aplicación +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - `lfc-skel`_, Provee una plantilla para crear una aplicación `django-lfc`_ CMS. +Para crear una aplicación dentro del proyecto :ref:`Django `, usa el siguiente comando: -- **Esqueletos de proyectos Pylons**: +.. code-block:: console - .. note:: - `Pylons`_, es un Framework Web Python, de propósito general. + python3 manage.py startapp blog - - `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``. +✅ Resultado: Carpetas listas para modelos, vistas, formularios y rutas. - - `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. +.. 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 -- **Esqueletos de proyectos CherryPy**: - .. note:: - `CherryPy`_, es un MicroFramework Web Python, de propósito general. +---- - - `CherryPaste`_, Usar CherryPy dentro Paste. -- **Esqueletos de proyectos Trac**: +🛠️ Ejemplo 3: Scaffolding con FastAPI + SQLModel + Typer +......................................................... - .. note:: - `Trac`_, es un sistema de gestión de proyectos de desarrollos de software. +Puedes usar generadores como `fastapi-code-generator`_ para :ref:`FastAPI ` o montar tu estructura así: - - `TracLegosScript`_, TracLegos es un software diseñado para ofrecer plantillas - para proyectos Trac y asiste con la creación de proyecto trac. +.. code-block:: console + :class: no-copy - - `trac_project`_, Plantilla de proyecto Trac de software de código abierto. + app/ + ├── main.py + ├── models/ + ├── routers/ + ├── services/ + └── config.py +O usar generadores personalizados. -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. +📌 Conclusión +.............. +- **Scaffolding** en Python no es algo nativo del lenguaje, pero se apoya en herramientas que te ayudan a estructurar proyectos rápidamente. -Referencias -........... +- Puedes usarlo para crear APIs, CLI, librerías, dashboards y más. -- `Gestión de proyectos con Buildout, instalando Zope/Plone con este mecanismo`_ - desde la comunidad de Plone Venezuela. +- Ideal para mantener orden desde el principio y escalar de forma profesional. ---- @@ -267,31 +271,7 @@ 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 +.. _`fastapi-code-generator`: https://pypi.org/project/fastapi-code-generator/ .. _`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 From f79008cdc8df88c73f117c4c3d7e70680a02021c Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 09:43:07 +0200 Subject: [PATCH 34/43] Updated the IPython references --- source/esquema.rst | 2 +- source/leccion10/locale.rst | 2 +- source/leccion2/bpython.rst | 2 +- source/leccion2/index.rst | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/esquema.rst b/source/esquema.rst index e8c60aa..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: diff --git a/source/leccion10/locale.rst b/source/leccion10/locale.rst index ae67cff..411faea 100644 --- a/source/leccion10/locale.rst +++ b/source/leccion10/locale.rst @@ -22,7 +22,7 @@ Uso del módulo :mod:`locale`: :linenos: :lines: 1-27 -Jugando con el módulo :mod:`locale` en el interprete :ref:`ipython `: +Jugando con el módulo :mod:`locale` en el interprete :ref:`IPython `: Obtener el nombre del mes de Diciembre en base a la configuración regional actual: diff --git a/source/leccion2/bpython.rst b/source/leccion2/bpython.rst index f95d6d4..e6571c5 100644 --- a/source/leccion2/bpython.rst +++ b/source/leccion2/bpython.rst @@ -4,7 +4,7 @@ Interprete bpython ------------------ Alternativamente puedes usar el paquete `bpython`_ que mejora aun más la experiencia -de trabajo con el paquete :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 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. From 42901d5df44fc8d6de0358af0c72693102e7a0c1 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 09:44:36 +0200 Subject: [PATCH 35/43] Added the pip references --- source/apendices/entornos_virtuales.rst | 5 +++-- source/leccion2/bpython.rst | 11 +++++++---- source/leccion2/ipython.rst | 4 +++- source/leccion6/ipdb.rst | 4 +++- source/leccion8/pastescript.rst | 20 ++++++++++++++++---- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/source/apendices/entornos_virtuales.rst b/source/apendices/entornos_virtuales.rst index 5480cba..c6fecf2 100644 --- a/source/apendices/entornos_virtuales.rst +++ b/source/apendices/entornos_virtuales.rst @@ -10,8 +10,9 @@ conflictos entre diferentes proyectos. Instalación ----------- -Para la instalación de la herramienta de entornos virtuales en Python, -ejecute el siguiente comando: +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:: diff --git a/source/leccion2/bpython.rst b/source/leccion2/bpython.rst index e6571c5..501bf86 100644 --- a/source/leccion2/bpython.rst +++ b/source/leccion2/bpython.rst @@ -6,9 +6,12 @@ Interprete bpython Alternativamente puedes usar el paquete `bpython`_ que mejora aun más la experiencia 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:: @@ -31,7 +34,7 @@ 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/ipython.rst b/source/leccion2/ipython.rst index a42e716..2225756 100644 --- a/source/leccion2/ipython.rst +++ b/source/leccion2/ipython.rst @@ -17,7 +17,9 @@ Según Wikipedia .. tip:: Para mayor información visite su página principal de `ipython`_. -Si necesita instalar este módulo, ejecute el siguiente comando: +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:: diff --git a/source/leccion6/ipdb.rst b/source/leccion6/ipdb.rst index 2e9f7c8..26d6718 100644 --- a/source/leccion6/ipdb.rst +++ b/source/leccion6/ipdb.rst @@ -9,7 +9,9 @@ El módulo `ipdb `_ exporta funciones para accede 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. -Si necesita instalar este módulo, ejecute el siguiente comando: +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:: diff --git a/source/leccion8/pastescript.rst b/source/leccion8/pastescript.rst index b3484c0..b85fab9 100644 --- a/source/leccion8/pastescript.rst +++ b/source/leccion8/pastescript.rst @@ -11,12 +11,24 @@ sirve aplicaciones web, con configuraciones basadas en `paste.deploy`_. Instalación ~~~~~~~~~~~ -Dentro de su `entorno virtual`_ activado debe instalar el paquete `PasteScript`_, -ejecutando el siguiente comando: +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: -.. code-block:: console +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + pip install PasteScript + + .. group-tab:: Windows + + .. code-block:: console + + pip install PasteScript - pip install PasteScript .. note:: From 0f15c46585ff4bbb61743e9f48d72d45e10304e8 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 09:45:53 +0200 Subject: [PATCH 36/43] Updated the leccion8 section --- source/leccion8/pastescript.rst | 2 +- source/leccion8/scaffolding.rst | 112 ++++++++++++++++++++++++-------- 2 files changed, 86 insertions(+), 28 deletions(-) diff --git a/source/leccion8/pastescript.rst b/source/leccion8/pastescript.rst index b85fab9..60d7840 100644 --- a/source/leccion8/pastescript.rst +++ b/source/leccion8/pastescript.rst @@ -2,7 +2,7 @@ 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`_. diff --git a/source/leccion8/scaffolding.rst b/source/leccion8/scaffolding.rst index 2b2da64..190063b 100644 --- a/source/leccion8/scaffolding.rst +++ b/source/leccion8/scaffolding.rst @@ -25,8 +25,10 @@ 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. + ---- + ¿Por qué usar Scaffolding? .......................... @@ -38,8 +40,10 @@ existente diversos *esqueletos* orientados a tipos de desarrollos específicos. - Acelera el inicio del desarrollo en frameworks web o CLI. + ---- + Herramientas comunes de Scaffolding en Python ............................................. @@ -58,25 +62,42 @@ Herramientas comunes de Scaffolding en Python | | para :ref:`FastAPI `. | | +-----------------------------+--------------------------------------------+----------------------+ + ---- -🛠️ Ejemplo 1: Usar `cookiecutter` para crear un proyecto Python -................................................................ -`cookiecutter`_, ofrece varias plantillas para cualquier tipo de proyecto. +Ejemplo 1: Scaffolding con paquete Python +......................................... -Paso 1: Instalar cookiecutter -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`cookiecutter`_, ofrece varias plantillas para cualquier tipo de proyecto Python. -Para instalar ``cookiecutter``, puedes usar :ref:`pip ` ejecute con el siguiente comando: +Para este caso, vamos a generar un proyecto de ejemplo para un paquete Python +que se llama ``mi_paquete``. -.. code-block:: console +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:: + + .. group-tab:: macOS, Linux, y Windows con WSL - pip install cookiecutter + .. code-block:: console + pip3 install cookiecutter -Paso 2: Ejecutar una plantilla pública -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. group-tab:: Windows + + .. code-block:: console + + pip3 install cookiecutter + + +Paso 2: Crear paquete Python +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `cookiecutter-pypackage`_, es una plantilla ``cookiecutter`` para un paquete Python. @@ -162,19 +183,31 @@ El generador te preguntará: ---- -🛠️ Ejemplo 2: Scaffolding con Django -..................................... +Ejemplo 2: Scaffolding con Django +................................. + +Por defecto, :ref:`Django ` incluye un comando para crear un nuevo proyecto y aplicaciones. -Por defecto, :ref:`Django ` incluye un comando para crear un nuevo proyecto. +Paso 1: Instalación +~~~~~~~~~~~~~~~~~~~ -Paso 1: Instalar Django -~~~~~~~~~~~~~~~~~~~~~~~ +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: -Para instalar :ref:`Django `, puedes usar :ref:`pip ` ejecute con el siguiente comando: +.. tabs:: -.. code-block:: console + .. group-tab:: macOS, Linux, y Windows con WSL - pip3 install Django + .. code-block:: console + + pip3 install Django + + .. group-tab:: Windows + + .. code-block:: console + + pip3 install Django Paso 2: Crear proyecto @@ -187,8 +220,8 @@ Para crear un nuevo proyecto :ref:`Django `, ejecuta el siguiente django-admin startproject mi_sitio && cd mi_sitio -Paso 3: Crear una aplicación -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Paso 3: Crear aplicación +~~~~~~~~~~~~~~~~~~~~~~~~ Para crear una aplicación dentro del proyecto :ref:`Django `, usa el siguiente comando: @@ -224,10 +257,11 @@ Para crear una aplicación dentro del proyecto :ref:`Django `, us ---- -🛠️ Ejemplo 3: Scaffolding con FastAPI + SQLModel + Typer -......................................................... +Ejemplo 3: Scaffolding con FastAPI +.................................. -Puedes usar generadores como `fastapi-code-generator`_ para :ref:`FastAPI ` o montar tu estructura así: +Puedes usar generadores como `fastapi-code-generator`_ para :ref:`FastAPI `, `SQLModel`_, y `Typer`_ +o montar tu estructura así: .. code-block:: console :class: no-copy @@ -241,12 +275,34 @@ Puedes usar generadores como `fastapi-code-generator`_ para :ref:`FastAPI ` +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 fastapi-code-generator + + .. group-tab:: Windows + + .. code-block:: console + + pip3 install fastapi-code-generator + ---- -📌 Conclusión -.............. +Conclusión +.......... -- **Scaffolding** en Python no es algo nativo del lenguaje, pero se apoya en herramientas que te ayudan a estructurar proyectos rápidamente. +- **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. @@ -273,5 +329,7 @@ O usar generadores personalizados. .. _`cookiecutter`: https://pypi.org/project/cookiecutter/ .. _`cookiecutter-pypackage`: https://github.com/audreyfeldroy/cookiecutter-pypackage -.. _`fastapi-code-generator`: https://pypi.org/project/fastapi-code-generator/ .. _`Django`: https://www.djangoproject.com/ +.. _`fastapi-code-generator`: https://pypi.org/project/fastapi-code-generator/ +.. _`SQLModel`: https://sqlmodel.tiangolo.com/ +.. _`Typer`: https://typer.tiangolo.com/ From 3e59d91dbb77965515c1863b34fb52fa61986902 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 11:34:44 +0200 Subject: [PATCH 37/43] Updated the pip section --- source/apendices/pip.rst | 54 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/source/apendices/pip.rst b/source/apendices/pip.rst index d428c79..1dd2d61 100644 --- a/source/apendices/pip.rst +++ b/source/apendices/pip.rst @@ -18,6 +18,56 @@ Instalar la herramienta :ref:`pip `, ejecute el siguiente comando: 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: + + .. 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: + + .. code-block:: console + + curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py + + Ejecute el script descargado utilizando Python: + + .. code-block:: console + + python get-pip.py + + Para verificar que :command:`pip` se ha instalado correctamente, escriba: + + .. code-block:: console + + pip --version + + Para verificar que el comando :command:`pip` se ha instalado correctamente, escriba: + + 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: @@ -32,7 +82,9 @@ Si ejecuto el comando anterior, este da como resultado lo siguiente: 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. +la paquete. + +Con esto, ya tiene todo listo para continuar. ---- From 0da9e5e8448ea5ecbe86ea21ace5d498b4dfcc65 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 14:25:02 +0200 Subject: [PATCH 38/43] Updated the pip version --- source/apendices/pip.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/apendices/pip.rst b/source/apendices/pip.rst index 1dd2d61..d52f53c 100644 --- a/source/apendices/pip.rst +++ b/source/apendices/pip.rst @@ -52,13 +52,13 @@ se presentan el correspondiente comando de tu sistema operativo: python get-pip.py - Para verificar que :command:`pip` se ha instalado correctamente, escriba: + Para verificar que el comando :command:`pip` se ha instalado correctamente, escriba: .. code-block:: console pip --version - Para verificar que el comando :command:`pip` se ha instalado correctamente, escriba: + 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``: From 34b603d3126cee9b504196b6dbc1847c5feaf92a Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 14:25:54 +0200 Subject: [PATCH 39/43] Updated the entornos_virtuales section --- source/apendices/entornos_virtuales.rst | 93 ++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 10 deletions(-) diff --git a/source/apendices/entornos_virtuales.rst b/source/apendices/entornos_virtuales.rst index c6fecf2..b0422a7 100644 --- a/source/apendices/entornos_virtuales.rst +++ b/source/apendices/entornos_virtuales.rst @@ -28,30 +28,103 @@ comando de tu sistema operativo: pip3 install virtualenv -Cree un directorio raíz para almacenar los diversos entornos virtuales, -ejecutando el siguiente comando: +Para verificar que el comando :command:`virtualenv` se ha instalado correctamente, escriba: -.. code-block:: console +.. 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 - mkdir ~/virtualenv && cd $_ Cree un entorno virtual llamado :command:`python3`, ejecutando el siguiente comando: -.. code-block:: console +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL - virtualenv --python /usr/bin/python3 python3 + .. 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: -.. code-block:: console +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + source ~/virtualenv/python3/bin/activate - 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: -.. code-block:: console +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + deactivate + + .. group-tab:: Windows + + .. code-block:: console + + deactivate - 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 From 4e16156e886e94b84788613299015fe1232881b8 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 14:41:58 +0200 Subject: [PATCH 40/43] Updated the pip section --- source/apendices/pip.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/apendices/pip.rst b/source/apendices/pip.rst index d52f53c..335f9f8 100644 --- a/source/apendices/pip.rst +++ b/source/apendices/pip.rst @@ -32,7 +32,7 @@ se presentan el correspondiente comando de tu sistema operativo: .. group-tab:: Windows En primer lugar, asegúrese de que Python está instalado en su sistema. Abra el símbolo - del sistema y escriba: + del sistema y escriba el siguiente comando: .. code-block:: console @@ -40,19 +40,20 @@ se presentan el correspondiente comando de tu sistema operativo: Si Python está instalado, mostrará el número de versión. - Descargue el script :file:`get-pip.py` de la pagina web oficial: + 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: + 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: + Para verificar que el comando :command:`pip` se ha instalado correctamente, escriba el + siguiente comando: .. code-block:: console From 894a8c21407b80e5f91b6477bb8507ee950dd406 Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 14:43:50 +0200 Subject: [PATCH 41/43] Updated the macOS references --- source/leccion1/caracteristicas.rst | 4 ++-- source/leccion1/instalacion.rst | 8 ++++---- source/leccion1/ventajas_desventajas.rst | 2 +- source/leccion8/distribucion_nativa.rst | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) 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/instalacion.rst b/source/leccion1/instalacion.rst index e23840a..aafcaad 100644 --- a/source/leccion1/instalacion.rst +++ b/source/leccion1/instalacion.rst @@ -15,12 +15,12 @@ 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: diff --git a/source/leccion1/ventajas_desventajas.rst b/source/leccion1/ventajas_desventajas.rst index 6f9543d..7840aa9 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. diff --git a/source/leccion8/distribucion_nativa.rst b/source/leccion8/distribucion_nativa.rst index 3ac21c1..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. From ce3aeb76092eed3e4b123e7b3738d209453913de Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Sun, 6 Apr 2025 14:45:12 +0200 Subject: [PATCH 42/43] Updated the leccion1 section --- source/leccion1/holamundo.rst | 32 ++++++++++++------------ source/leccion1/instalacion.rst | 6 ++--- source/leccion1/ventajas_desventajas.rst | 24 +++++++++++++----- source/leccion2/interactivo.rst | 2 +- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/source/leccion1/holamundo.rst b/source/leccion1/holamundo.rst index df4dacc..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,7 +126,7 @@ 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. @@ -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 aafcaad..bd25111 100644 --- a/source/leccion1/instalacion.rst +++ b/source/leccion1/instalacion.rst @@ -12,7 +12,7 @@ ciertos recursos para los sistemas operativos más populares: Instalando Python en Windows ............................ -- `Instalando Python en Windows `_. +- `Instalando Python en Windows `_. .. _python_instalacion_macos: @@ -25,8 +25,8 @@ Instalando Python en 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: diff --git a/source/leccion1/ventajas_desventajas.rst b/source/leccion1/ventajas_desventajas.rst index 7840aa9..45fb201 100644 --- a/source/leccion1/ventajas_desventajas.rst +++ b/source/leccion1/ventajas_desventajas.rst @@ -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/leccion2/interactivo.rst b/source/leccion2/interactivo.rst index 6222375..f5d41cd 100644 --- a/source/leccion2/interactivo.rst +++ b/source/leccion2/interactivo.rst @@ -36,7 +36,7 @@ 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 From db5d8926b49dce919937e5a495548d3dc3d0271f Mon Sep 17 00:00:00 2001 From: "Leonardo J. Caballero G" Date: Mon, 7 Apr 2025 20:41:37 +0200 Subject: [PATCH 43/43] Updated the scaffolding section --- recursos/leccion8/mi_paquete.zip | Bin 0 -> 19875 bytes recursos/leccion8/mi_sitio.zip | Bin 0 -> 6346 bytes source/leccion8/scaffolding.rst | 75 ++++++++++++++++++++++++++++--- 3 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 recursos/leccion8/mi_paquete.zip create mode 100644 recursos/leccion8/mi_sitio.zip diff --git a/recursos/leccion8/mi_paquete.zip b/recursos/leccion8/mi_paquete.zip new file mode 100644 index 0000000000000000000000000000000000000000..c1d9ea5a48ccb0e092e0cb20e4ef297da597f17b GIT binary patch literal 19875 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 literal 0 HcmV?d00001 diff --git a/recursos/leccion8/mi_sitio.zip b/recursos/leccion8/mi_sitio.zip new file mode 100644 index 0000000000000000000000000000000000000000..625f2ebf5b4680aae02f4c5e7214f865e4a2118b GIT binary patch literal 6346 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 incluye un comando para crear un nuevo proyecto y aplicaciones. @@ -257,8 +257,8 @@ Para crear una aplicación dentro del proyecto :ref:`Django `, us ---- -Ejemplo 3: Scaffolding con FastAPI -.................................. +Ejemplo 3: Proyecto FastAPI +........................... Puedes usar generadores como `fastapi-code-generator`_ para :ref:`FastAPI `, `SQLModel`_, y `Typer`_ o montar tu estructura así: @@ -288,7 +288,7 @@ comando de tu sistema operativo: .. code-block:: console - pip3 install fastapi-code-generator + pip3 install "fastapi-code-generator==0.5.2" .. group-tab:: Windows @@ -296,6 +296,57 @@ comando de tu sistema operativo: pip3 install fastapi-code-generator +Usted puede probar la instalación existe, ejecutando el siguiente comando: + +.. tabs:: + + .. group-tab:: macOS, Linux, y Windows con WSL + + .. code-block:: console + + python3 -c "import fastapi_code_generator ; print(fastapi_code_generator.__package__)" + + .. group-tab:: Windows + + .. code-block:: console + + python3 -c "import fastapi_code_generator ; print(fastapi_code_generator.__package__)" + +Si muestra el nombre del módulo ``fastapi_code_generator``, tiene correctamente instalado el módulo. +Con esto, ya tiene todo listo para continuar. + +.. code-block:: console + + fastapi-codegen --help + + + +.. 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. │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + ---- Conclusión @@ -308,6 +359,16 @@ Conclusión - Ideal para mantener orden desde el principio y escalar de forma profesional. +---- + +.. important:: + Usted puede descargar el código usado en esta sección, haciendo clic en los + siguientes enlaces: + + - :download:`mi_paquete.zip <../../recursos/leccion8/mi_paquete.zip>`. + + - :download:`mi_sitio.zip <../../recursos/leccion8/mi_sitio.zip>`. + ----