¿Que es ipython? Ipython es un interprete interactivo para python, que ofrece muchas mejoras al lado del interprete interactivo de python -ojo!, no digo que sea mejor, o peor, yo no lo uso mucho
-, pero es bueno conocer las distintas posibilidades que tenemos, ¿no?. Siguiendo con ipython, es un proyecto de Software Libre con licencia BSD, es multiplataforma, tiene autocompletado con la tecla <tab> y muchas funcionalidades más. Como dijo Humitos: “Tenes una consola dentro del interprete de python”.
Si porque eso no lo mencione, pero podemos navegar por el arbol de directorios como si estuvieramos en el shell.
Instalacion en Debian y sus derivados:
debian:/home/nercof# apt-get install ipython
Manos a la obra: primero explico uno comandos basicos y útiles para mi, y despues lo de Exepciones.
Declaremos algunas variables primero.
In [1]: var = 1
In [2]: enum = 2
In [3]: cadena = 'hola'
In [4]: cadenita = 'txt'
El autocompletado con tab, mustra las coincidencias
In [5]: ca
cadena cadenita callable cat
Podemos listar las variables que tenemos activas en la pila de memoria con el comando “whos”, que no solo las lista sino nos menciona el tipo de dato y el valor que tienen:
In [5]: whos
Variable Type Data/Info
----------------------------
cadena str hola
cadenita str txt
enum int 2
var int 1
El anterior es un comando propio de ipython, pertenece a las llamadas funciones “magicas” :p, para poder ver todas, solo hagamos:
In [6]: %lsmagic
Available magic functions:
%Exit %Pprint %Quit %alias %autocall %autoindent
%automagic %bg %bookmark %cd %clear %color_info
%colors %config %cpaste %dhist %dirs %ed %edit
[...]
%lsmagic %macro %magic %p %page %pdb
[...]
%who %who_ls %whos %xmodeAutomagic is ON, % prefix NOT needed for magic functions.
Y todos los comandos de consola, por dar un ejemplo:
In [9]: pwd
Out[9]: '/home/nercof'
Ahora a las expciones:
Para trabajar con las expciones hice un pequeño ejemplo, solo cree una lista e imprimo el valor de la misma que se encuentra en el índice que me pasan por parámetro y lo guarde en el archivo ejemplo.py:
class Ejemplo:
def __init__(self, i):
self.a = [1,2,3,4]
print self.a[i]
Ahora desde ipython cargamos ese ejemplo y empesamos a jugar con las exepciones:
In [11]: from ejemplo import Ejemplo
In [12]: Ejemplo(2)
Out[13]:3
Ipython contiene tres formas de distintas de reportar una exepcion, una de ellas es la que el interprete interactivo de python usa.
Modo Context: es la que se muestra por defecto, este modo imprime 5 líneas del contexto del código fuente donde sucedio la exepcion, indicando la linea de código que presenta el conflicto
Con nuestro ejemplo veriamos algo asi:
In [12]: Ejemplo(4)
---------------------------------------------------------
exceptions.IndexError Traceback (most recent call last)
/home/nercof/Proyectos/blog/
/home/nercof/Proyectos/blog/ejemplo.py in __init__(self, i)
3
4 class Ejemplo:
5 def __init__(self, i):
6 self.a = [1,2,3,4]
----> 7 print self.a[i]
IndexError: list index out of range
Modo Plain: es similar al reporte del traceback del interprete de python. Para seleccionar este modo recurrimos a una de las funciones mágicas “xmode” y hacemos lo siguiente:
In [14]: xmode Plain
Exception reporting mode: Plain
In [15]: Ejemplo(4)
------------------------------------------------------------
Traceback (most recent call last):
File "", line 1, in ?
File "ejemplo.py", line 7, in __init__
print self.a[i]
IndexError: list index out of range
Modo Verbose: similar al modo “Context” pero adicionando la impresion de las variables actuales visibles con sus respectivos valores al momento de ocurrir la exepcion. Es muy útil, porque podemos ver realmente que tienen cuando “explota” nuestro código, pero es potencialmente lento, si nuestra estructura de datos es muy compleja de computar. Para nuestro ejemple puede andar
, miremos que pasa:
In [17]: Ejemplo(4)
-----------------------------------------------------------
exceptions.IndexError Traceback (most recent call last)
/home/nercof/Proyectos/blog/
/home/nercof/Proyectos/blog/ejemplo.py in
__init__(self=<ejemplo.Ejemplo instance>, i=4)
3
4 class Ejemplo:
5 def __init__(self, i):
6 self.a = [1,2,3,4]
----> 7 print self.a[i]
self.a = [1, 2, 3, 4]
i = 4
IndexError: list index out of range
In [18]:
Y con eso concluye la forma en que se muestran, ó reportan las exepciones, esta en cada uno elegir la que mas le guste, como ya lo dije Ipython trae una por defecto, pero si a nosotros nos gusta mas otra, no duden en configurarlo, y es muy simple, solo vallan a la carpeta donde se instalo el programa, usualmente en el home de tu usuario -ojo que esta oculta- y acceden a ella para buscar y editar el archico “ipythonrc”, buscando las siguientes lineas:
[...]
#xmode Plain
xmode Context
#xmode Verbose
[...]
Y descomentan la que mas les guste y comentan “Context” y listo!.
Otra forma que tenemos es interactuar directamente con el debugger de python “pdb”, haciendo lo siguiente:
In [18]: pdb
Automatic pdb calling has been turned ON
In [19]: Ejemplo(4)
---------------------------------------------------------------------------
exceptions.IndexError Traceback (most recent call last)
/home/nercof/Proyectos/blog/
/home/nercof/Proyectos/blog/ejemplo.py in
__init__(self=<ejemplo.Ejemplo instance>, i=4)
3
4 class Ejemplo:
5 def __init__(self, i):
6 self.a = [1,2,3,4]
----> 7 print self.a[i]
self.a = [1, 2, 3, 4]
i = 4
IndexError: list index out of range
> /home/nercof/Proyectos/blog/ejemplo.py(7)__init__()
5 def __init__(self, i):
6 self.a = [1,2,3,4]
----> 7 print self.a[i]
ipdb> list
2 # -*- coding: utf-8 -*-
3
4 class Ejemplo:
5 def __init__(self, i):
6 self.a = [1,2,3,4]
----> 7 print self.a[i]
ipdb>exit
Esto nos deja la accion de interactuar con el debugger directamente. Para ver mas sobre esta herramienta pueden ver aquí, o sino vean este artículo escrito por Humitos Python Debugger