157 cosas de IPython que no sabías y nunca preguntaste (II)

En la primera entrega vimos como usar la ayuda de IPython y como personalizar nuestras propias funciones mágicas de ayuda.

En esta segunda entrega vamos a hablar del uso de la historia dentro de IPython.

[Inciso: Os recomiendo que veáis lo que viene a continuación en el notebook o en nbviewer.]

IPython guarda la historia de los comandos que se usan en cada línea/celda de cada sesión bajo un determinado perfil. Esta información se guarda en una base de datos sqlite. Por defecto, se guardan el inicio y fin de sesión, los comandos usados en cada sesión y algunos metadatos más. IPython también se puede configurar para que almacene los outputs.

Historia

La base de datos con la historia se guarda en la carpeta que obtenéis haciendo lo siguiente:

Y la base de datos se guardará en esa carpeta con el nombre history.sqlite.

Una forma alternativa de obtener la ruta a la historia bajo el perfil actual es usando lo siguiente:

Acceso a determinadas celdas de la historia

Para reusar comandos ya usados podemos hacer uso de la historia que guarda IPython en cada sesión.

  • Podemos usar las teclas de cursor hacia arriba o hacia abajo para recorrer los últimos comandos usados (esto no funciona en el notebook pero sí en la consola de IPython).
  • Si escribimos algo en la línea de comandos y pulsamos el cursor hacia arriba nos mostrará solo lo que comience por lo ya escrito en la línea de comandos (nuevamente, esto no funciona en el notebook pero sí en la consola de IPython).
  • En las sesiones interactivas, el input y el output se guarda en las variables In y Out. Poniendo el índice de la línea usada nos volverá a ejecutar esa línea, en el caso de que usemos la variable In o nos mostrará el output en caso de que usemos la variable Out. In es una lista mientras que Out es un diccionario. En el caso de que no haya output para un número de línea nos dará un KeyError. Por ejemplo, veamos las siguientes celdas de código:

Nos mostrará en pantalla lo siguiente (esto puede variar en función de lo que hayáis escrito previamente en la consola o el notebook, lo siguiente solo sirve como ejemplo):

Mientras que si hacemos lo mismo para Out obtendremos la siguiente info (esto puede variar en función de lo que hayáis escrito previamente en la consola o el notebook, lo siguiente solo sirve como ejemplo):

Si ahora hacemos lo siguiente:

Nos mostrará un 2 en pantalla pero no lo guarda en el Output puesto que solo es visualización. Por tanto, lo siguiente:

Nos mostrará (esto puede variar en función de lo que hayáis escrito previamente en la consola o el notebook, lo siguiente solo sirve como ejemplo):

Vemos que en Out se encuentra lo que hemos obtenido en las primeras celdas de código. Si ahora queremos ver otro output podemos hacer lo siguiente:

Y, como no lo hemos mostrado con un print, se añade al Output.

Vemos que ya tenemos algún valor para el Out y ya podremos acceder a ese valor por si lo quisiéramos usar en alguna otra celda. Por ejemplo, de la siguiente forma:

Nos mostraría 2 en pantalla.

Como el In siempre lo tendremos, en lugar de ser un diccionario es una lista y podemos acceder al valor de la celda usando el índice de la misma. Por ejemplo:

Nos mostraría lo siguiente (o algo aproximado a lo siguiente):

También podemos acceder a los tres últimos outputs de las tres últimas celdas usando _, __, ___, que nos mostrará el output de la última, penúltima o antepenúltima celdas usadas, respectivamente.

[sourcecode language=”python”]
print(‘antepenúltima:n’, ___, ‘nn’)
print(‘penúltima:n’, __, ‘nn’)
print(‘última:n’, _, ‘nn’)
[/sourcecode]

Si queremos acceder a los inputs de las últimas celdas podemos usar algo parecido pero de la siguiente forma, _i, _ii o _iii para la última, penúltima o antepenúltima celda de input:

Análogamente a lo visto anteriormente, podemos usar _n o _in para mostrar, respectivamente, el output o el input de la celda n. Por ejemplo, para ver el input y el output de la celda anterior (en este caso sería la 11) podemos hacer lo siguiente:

Que nos mostrará:

Y para el output:

Lo anterior es equivalente a usar In[n] o Out[n]. Una tercera alternativa, además, sería usar _ih[n] para los inputs y _oh[n] para los outputs.

Mostrará:

Mientras que:

Nos mostrará lo mismo:

Acceso a bloques de historia

Para acceder a toda la historia de la sesión actual podemos usar las funciones mágicas %history o %hist, que es un alias.

Podemos obtener toda la historia o solo una porción. Por ejemplo, el siguiente comando nos mostrará la historia desde la celda 1 a la 10 en la sesión actual:

Si, además de acceder a las celdas 1 a 10, queremos acceder a celdas sueltas podemos usar la siguiente notación para acceder a las celdas 12 y 14 (además de a las 10 primeras).

Si ahora queremos acceder a todas las celdas donde hayamos usado, por ejemplo, un comando que incluya ‘a = 1’ podemos hacer uso de la opción -g (similar a grep) de la siguiente forma (la salida dependerá de vuestra historia):

[Gracias a la historia sé que escribo demasiado código estúpido… :-(]

Pero esta busqueda no se restringe a la historia de la sesión actual sino que buscará en toda la historia almacenada por IPython bajo el perfil que estemos usando. El anterior output indica la sesión, el número de línea/celda de esa sesión y el código usado en esa línea/celda con la siguiente notación:

Sesión/celda: Código_introducido_en_la_celda

En este caso, podéis ver que en la última línea no se indica el número de sesión puesto que se refiere a la sesión actual.

Si usamos la opción -o también obtendremos la historia con el output incluido. Podéis ver el siguiente ejemplo para ver como funciona:

Otra cosa interesante es la opción -p, que coloca un prompt delante de cada línea de la historia que se muestra. Esto puede ser útil para, por ejemplo, escribir doctests.

En el siguiente ejemplo vamos a usar la opción -p junto con la opción -o:

Si queremos guardar la historia o parte de la historia en un fichero para, por ejemplo, los doctests, podemos usar la opción -f.

Con la siguiente línea de código vamos a guardar el input, el output y vamos a colocar la línea del prompt de las 10 primeras celdas en un fichero llamado kk.txt:

Si queremos acceder a la historia de una sesión anterior podemos usar lo siguiente:

De esta forma accederemos a las 10 primeras líneas de la sesión anterior. Si queremos acceder a las 10 primeras líneas de la penúltima sesión podemos hacer:

Si, además, queréis numerar las celdas usadas podéis usar la opción -n:

Algunos de los comandos usados no son aceptados por un intérprete Python cualquiera, como por ejemplo los comandos mágicos que empiezan por %. Por ello, podemos obtener los comandos ya traducidos a código Python ejecutable usando la opción -t de la historia:

En alguna línea podéis ver que en lugar de escribir %pinfo In he escrito get_ipython().magic('pinfo In').

Acceso a la historia de los directorios usados

_dh (también podemos usar %dhist) nos da información de los directorios recorridos. Por ejemplo, voy a recorrer varios directorios y después veremos la historia de los directorios recorridos:

Si ahora escribimos:

O algo, más o menos, equivalente:

En este caso nos devuelve una lista:

Si solo quiero saber el directorio del que partí en la sesión de IPython en la que me encuentro puedo hacer lo siguiente:

Y obtengo:

Y esto es todo de momento. Podéis combinar muchas cosas de las vistas aquí con cosas como %macro, %edit, %pastebin,… Si da tiempo, algo muy caro últimamente, hablaremos sobre algunas cosas que se me ocurren en próximas entregas.

Saludos y hasta la próxima entrega.

P.D.: Si veis alguna errata podéis usar los comentarios o mandar algún commit al repositorio de los notebooks.

2 pensamientos sobre “157 cosas de IPython que no sabías y nunca preguntaste (II)”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

− 1 = one