IPython y comando mágicos



@eduardo_gpg

Número de visitas 2063

Tiempo de lectura 6 min

27 Julio 2021

IPython es sin duda una de mis herramientas favoritas en cuanto al desarrollo en Python se refiere. Después de crear mi entorno de desarrollo, mi siguiente tarea es siempre instalar IPython. No importa si el proyecto es relativamente pequeño o no, si es web o no. No importa, IPython siempre estará para todos mis proyectos. 🧐

Por la gran facilidad que esta herramienta nos ofrece, tanto para crear como testear código Python, me gustaría explicarte en detalle qué es IPython y cómo podemos sacarle el máximo provecho en nuestros procesos de desarrollo. 🐍

Es una herramienta que sin duda vale muchísimo la pena, así que te invito a que te quedes al final de esta entrega.

Bien, si más introducción comencemos con el tutorial.

IPython

Si nunca habías escuchado acerca de IPython, bueno, aquí te lo explico. IPython es una Shell interactivo de Python, un Shell con baterías incluida.

IPython no se encuentra dentro de la biblioteca estándar de Python, por lo tanto para poder utilizar esta herramienta será necesario instalarla. Para ello ejecutamos el siguiente comando.

pip install ipython 

Una vez la librería se haya instalado, podremos ingresar a su Shell interactivo ejecutando en terminal el comando ipython.

Dentro del Shell seremos capaces de escribir y ejecutar código Python.

Lo primero que podemos notar es el auto completado. Haciendo uso de la tecla tab podremos auto completar variables, funciones, clases, imports, rutas etc...

Algo sin duda super útil para nuestro desarrollo.

Pero lo más interesante de IPython no son sus colores o el auto completado, no. Lo interesante de IPython son sus comandos mágicos.

Los comandos mágicos no son más que comandos que nos permitirán resolver tareas cotidianas en el desarrollo. Estos comandos se identifican por el prefijo porcentaje (%).

Existen una gran cantidad de comandos mágicos, sin embargo para este post me gustaría compartir los que considero los más relevantes, los que sin duda usaremos en nuestro día a día.

Comandos Mágicos.

Comencemos con el comando %time. Un comando mágico que nos permitirá conocer cuanto tiempo a tomado una tarea ser completada. U comando super útil cuando nos encontramos midiendo rendimientos de performance.

Para utilizar este comando basta con llamarlo y pasar como argumento la tarea de la cual queremos conocer su tiempo de ejecución.

def python_task():
    import time
    time.sleep(2)
    print('Fin de la tarea!')

%time python_task() 

Fin de la tarea!
CPU times: user 310 µs, sys: 841 µs, total: 1.15 ms
Wall time: 2 s

En este caso para fines prácticos mi función toma una pequeña siesta de 2 segundos. 🥱

Ahora, si lo que deseamos medir no es una función o método, si no un bloque de código, haremos uso del doble porcentaje (%%).

In [6]: import time

In [7]: %%time
   ...: for i in range(3):
   ...:     time.sleep(1)

CPU times: user 889 µs, sys: 13 µs, total: 902 µs
Wall time: 3 s

Ahora hablemos del comando %run, un comando que, como su nombre nos dice, nos permite ejecutar scripts directamente en el Shell de IPython. Veamos.

Imaginemos que tenemos el siguiente archivo .py

main.py

for x in range(0, 10):
    print(x)

Para ejecutarlo directamente en el Shell usaremos el comando %run. Basta como pasar como argumento la ruta del archivo a ejecutar. Ya sea una ruta relativa o absoluta.

In [1]: %run main.py
0
1
2
3
4
5
6
7
8
9

Y en caso el archivo .py a su vez necesite argumentos para su ejecución, colocamos dichos argumentos sobre el comando %run.

%run example.py argumento1 argumento2 argumento3

Si queramos echarle un vistazo al código fuente y ejecutarlo, hacemos uso del comando %load.

In [2]: # %load main.py
   ...: for x in range(0, 10):
   ...:     print(x)
   ...:

Ojos es importante mencionar que este comando no permite editar el código fuente. El comando %load simplemente carga todo el contenido del archivo en el namespace de IPython. Con lo cual podremos ejecutar el código fuente y hacer uso de sus variables, funciones, clases etc...

Si queremos editar un archivo .py lo ideal sería hacer uso del comando mágico %edit.

In [1]: %edit main.py

El comando %edit abrirá un editor de texto donde podremos modificar el archivo.

Y, si solo queremos visualizar el contenido de un archivo, sin ejecutarlo o editarlo, hacemos uso del comando %pycat.

In [1]: %pycat main.py
for x in range(0, 10):
    print(x)

Y, ya que mencionamos el namespace ¿Qué pasa si queremos eliminar todas las variables, funciones y clases creadas hasta este momento? Bueno, para ello haremos uso del comando mágico __%reset_, eliminando todo el cache de memoria.

In [3]: %reset
Once deleted, variables cannot be recovered. Proceed (y/[n])? y

Te aconsejo tengas cuidado con este comando, ya que una vez limpio el namespace no hay forma de recuperar los valores para las variables creadas anteriormente. Todo se perderá.

Así que, una muy buena, idea antes de ejecutar este comando, es inspeccionar que variables tenemos en memoria.

In [7]: nombre = 'Eduardo'
In [8]: titulo = 'Artículo iPython'

In [9]: %who
nombre   titulo

Para este ejemplo cree 2 nuevas variables, las cuales listo mediante el comando mágico %who.


Crear archivos 📃

Algo que simplemente me encanta de IPython es la posibilidad de guardar todas las líneas código ejecutas en el Shell, sí, así como lo escuchas. Esos días donde testeabas tu código en terminal, y si funciona copiabas y pegabas en tu editor de texto, ya podemos dejarlos en el pasado. (Bueno, por lo menos eso hacia yo).

Para crear un nuevo archivo hacemos uso del comando %save, pasando como argumentos de que línea a que línea queremos guardar.

Veamos un ejemplo.

In [1]: username = 'EduardoGPG'

In [2]: name = 'Eduardo Ismael'

In [3]: %who
name     username

In [4]: print(f'Hola {username}')
Hola EduardoGPG

In [5]: print(name)
Eduardo Ismael

In [6]: print('Nos encontramos en una nueva entrega')
Nos encontramos en una nueva entrega

Procedemos a guardar.

In [7]: %save example.py 1-2 4-6

File `example.py` exists. Overwrite (y/[N])?  y

The following commands were written to file `example.py`:
username = 'EduardoGPG'
name = 'Eduardo Ismael'
print(f'Hola {username}')
print(name)
print('Nos encontramos en una nueva entrega')

Para este ejemplo le indico a IPython que quiero crear el archivo example.py,con las líneas de la 1 a la 2 y de la 4 a la 6, excluyendo la línea 3.

El comando nos da un preview de todo lo almacenado en dicho archivo.

Y por supuesto, si queremos conocer en más detalle, podemos utilizar los comandos previamente mencionados: %edit o %pycat.


Introspección 🔎

Algo que sin duda me bolo la cabeza cuando lo supe, es lo fácil que podemos conocer el código fuente de funciones, clases y métodos con IPython. 🤯

Para ello utilizamos la introspección.

Vemos un par de ejemplos.

In [11]: def suma(a, b):
    ...:     """" Retorna la suma de a + b """
    ...:     return a + b
    ...:

In [12]: suma?
Signature: suma(a, b)
Docstring: " Retorna la suma de a + b
File:      ~/projects/blue/<ipython-input-11-d3e295ae5f56>
Type:      function

En este caso he definido la función suma, si quiero conocer su tipo, docstring y a que archivo pertenece, basta con colocar el objeto seguido del subfijo signo de interrogación (?).

Esto no solo funciona para funciones, también podemos hacerlo para variables.

In [13]: nombre = 'Eduardo'

In [14]: nombre?
Type:        str
String form: Eduardo
Length:      7
Docstring:

Aun que lo común es conocer información sobre bloques de códigos. 😜

y, en caso queramos conocer el código de una función, clase o método recurriremos al doble signo de interrogación (??).

Ejemplo.

In [16]: def palindromo(sentence):
    ...:     """Retornar V/F si la sentencia es un palindromo"""
    ...:     return sentence.lower() == sentence.lower()[::-1]
In [19]: palindromo??
Signature: palindromo(sentence)
Source:
def palindromo(sentence):
    """Retornar V/F si la sentencia es un palindromo"""
    return sentence.lower() == sentence.lower()[::-1]
File:      ~/projects/blue/<ipython-input-16-93fa369798f4>
Type:      function

Listado de comandos

Ya para finalizar, me gustaría recalcar que, como mencione anteriormente, estos no son todos los comandos mágicos que podemos utilizar con IPython. Así que si te interesa conocer cada uno de ellos, te recomiendo ejecutes el comando %lsmagic..

In [9]: %lsmagic
Out[9]:
Available line magics:
%alias  %alias_magic  %autoawait  %autocall  %autoindent  %automagic  %bookmark  %cat  %cd  %clear  %colors  %conda  %config  %cp  %cpaste  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %paste  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

Un comando que nos listará todos los comandos mágicos disponibles, y para que puedas conocer exactamente como funciona cada uno de ellos puedes recurrir a la introspección. Recuerda, basta con utilizar doble signo de interrogación (??).

Ejemplo.

In [10]: %alias??

¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍