Inicio > linux, Programacion, python > Exepciones en IPython

Exepciones en IPython

Free Image Hosting at www.ImageShack.us ¿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

Categorías:linux, Programacion, python
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: