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.
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.
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]:
...: 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.
s 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 encontramoen 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??