lightbulb_outline

Comandos mágicos en IPython

Lees en 4 Min.

4794 visitas

14/04/20

IPython es, desde mi punto de vista, una de las herramientas indispensables para cualquier desarrollador Python. IPython es un proyecto el cual nos permite interactuar con el intérprete de Python de una forma muy sencilla, agilizando de esta forma nuestro proceso de desarrollo. IPython no solo esta limitado en autocompletar las sentencias, no, nada de eso; de hecho creo que lo interesante de IPython lo encontramos en sus comandos mágicos.

Si no lo sabes, los comandos mágicos no son más que comandos los cuales están pensandos para resolver tareas comunes y repetitivas. Son muy fáciles de identificar, ya que poseen el prefijo de porcentaje (%).

Es por ello que, en esta ocasión, me gustaría lista un par de comandos mágicos los cuales, no dudo, te serán de mucha utilidad en tu día a día en el desarrollo Python. 🐍

Bien, sin más que decir, comencemos.

Tiempo de ejecución

Comencemos con el comando %time. Este comandos nos permite conocer cuánto tiempo le toma a una tarea finalizar se ejecución. Un comando muy útil cuando necesitamos medir rendimiento y performance de nuestra aplicación.


def super_task():
    import time
    time.sleep(1)
    print('Fin de la tarea!')

%time super_task() 
Fin de la tarea!
CPU times: user 310 µs, sys: 841 µs, total: 1.15 ms
Wall time: 1 s

Otra forma en la cual podemos conocer el tiempo de ejecución, en este caso de un bloque de código, es con: %%time.

 %%time 
for i in range(0, 10000): 
    if i % 2 ==  0: 
        print(i) 

CPU times: user 11.6 ms, sys: 3.96 ms, total: 15.6 ms
Wall time: 15.5 ms

Limpiar namespace

Muy probablemente usaremos IPython para pruebas locales, por ejemplo si queremos testear el funcionamiento de algún método, si queremos realizar operaciones simples, alguna que otra consulta rápida a nuestra base de datos etc... En esos caso, una vez hayamos terminado de realizar las pruebas y nos interese mantener nuestro namespace limpio, haremos uso del comando mágico %reset. Este comando limpiará todo el namespace generado hasta ese momento, esto incluye por supuesto variables, funciones, clases, etc...

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

Listar variables

Antes de limpiar el namespace una muy buena idea será echarle un vistazo a todas aquellas variables declaradas. Por simple precaución. 😅

Para ello podemos utilizar el comando %who.

plataforma = 'CódigoFacilito'
tutor = 'Eduardo'

%who  
plataforma   super_task  tutor   

En este caso también visualizamos mi función super_task.

Ejecutar archivos .py

Habrá ocasiones en las cuales deseemos testear nuestro módulos , ya sea para probar su funcionamiento, para probar la entrada o salida de datos, el performance etc... En esos casos sin duda haremos uso del comando mágico %run.

Este comando recibe como argumento el archivo (con su correspondiente ruta) el cual deseemos ejecutar.

Si el módulo recibe argumentos podemos colocarlos directamente en la ejecución.

%run example.py argumento

Cargar el contenido de un archivo.py

Si en dado caso no deseemos ejecutar el módulo y solo deseemos cargar su contenido (todo el código fuente) podemos utilizar el comando %load, Este comando recibe como argumento, al igual que el comando %run, el archivo con el cual deseamos trabajar.

%load example.py

Este comando resulta muy útil en casos donde queramos experimentar un poco con el código del archivo, realizando una que otra modificación.

Es importante mencionar que el comando solo carga el contenido del archivo, si en dado caso modificamos este, los cambios no se verán reflejados en el archivo original.

VIsualizar el contenido de un archivo.py

Por otro lado, si no queremos cargar el contenido un módulo y simplemente queremos visualizarlo, podemos utilizar el comando %pycat. De igual forma el comando recibe como argumento el archivo del cual queramos conocer su contenido.

%pycat example.py

Otra forma de visualizar el contenido de un archivo (No necesariamente .py) es utilizando el comando %cat.

%cat example.py 

Introspección

La forma más sencilla de conocer más acerca de un objeto con IPython es a través de la introspección. Podemos lograr esto haciendo uso del signo de interrogación (?) o del doble signo de interrogación (??).

def saluda(username):
    """Retorna un saludo al usuario"""
    return "Hola " + username + " un gusto conocerte."

saluda?  

Signature: saluda(username)
Docstring: Retorna un saludo al usuario
File:      ~/Documents/<ipython-input-27-cd9b0a4ef317>
Type:      function

Al utilizar el doble signo de interrogación no solo conoceremos más información acerca del objeto, si no también su código fuente.

saluda??

Signature: saluda(username)
Source:   
def saluda(username):
    """Retorna un saludo al usuario"""
    return "Hola " + username + " un gusto conocerte."
File:      ~/Documents/<ipython-input-27-cd9b0a4ef317>
Type:      function

Pues bien, todo esto también podemos hacerlo utilizando el comando mágico %pinfo.

%pinfo saluda 

Signature: saluda(username)
Docstring: Retorna un saludo al usuario
File:      ~/Documents/<ipython-input-27-cd9b0a4ef317>
Type:      function

Aunque de forma personal recomiendo hacer uso del signo y doble signo de interrogación.

Guardar archivos

Si en dado caso queramos persistir en un archivo con todas las sentencias y comandos ejecutados basta con utilizar el comando mágico %save. Utilizando este comando seremos capaces de crear/sobreescribir un archivo a partir de ciertas líneas en concretas.


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

In [2]: resultado = suma(10, 20)  

In [3]: print('El resultado es:', resultado)    
El resultado es: 30

In [4]: %save operacion.py 1-3     

En este caso creamos el archivo operacion.py el cual comprende de la línea 1 a la 3 del shell de IPython.

Listado de comandos

Y finalmente el comando que nos ayudará a conocer los otros comandos. Me refiero al comando mágico %lsmagic.

_%lsmagic_.

Si queremos conocer el funcionamiento de un comando en particular podemos hacer uso del signo de interrogación (?)

%save?

Bonus

En caso deseemos conocer el tiempo de ejecución de algún bloque de código, o inclusive de algún módulo en particular, sepamos que podemos hacerlo utilizando doble porcentaje (%%) para el comando time.

%%time 
...: %run demo.py 
%%time 
...: for x in range(10, 1000): 
...:     print(x) 

Y bien, estos fueron algunos comandos mágicos los cuales no dudo te serán de mucha utilidad en tu proceso de desarrollo.Por su puesto no son los únicos, pero sí los que considero yo los más útiles.

Otros artículos del blog

Comentarios

Ver respuestas (1)