Depuración en Python con Pdb

El módulo PDB en Python nos brinda aspectos destacados gigantes para una depuración convincente del código de Python. Esto incorpora:  

  • Pausa del programa
  • Mirando la ejecución de cada línea de código.
  • Comprobación de los valores de las variables

Este módulo ya está instalado con la instalación de python. Entonces, solo necesitamos importarlo a nuestro código para usar su funcionalidad. Antes de ello debemos conocer algunos conceptos los cuales se mencionan a continuación:

  1. Para importar simplemente usamos import pdb en nuestro código.
  2. Para la depuración, utilizaremos el método pdb.set_trace() . Ahora, en Python 3.7 el método breakpoint() también está disponible para esto.
  3. Ejecutamos esto en la terminal inactiva de Python (puede usar cualquier terminal ide para ejecutar).

Comencemos con un ejemplo simple que consta de algunas líneas de código. 

Ejemplo:

Python3

# importing pdb
import pdb
  
# make a simple function to debug
def fxn(n):
    for i in range(n):
        print("Hello! ", i+1)
  
  
# starting point to debug
pdb.set_trace()
fxn(5)

Producción:

Aquí, podemos ver que cuando se realiza la llamada a la función, pdb se ejecuta y solicita el siguiente comando. Podemos usar algunos comandos aquí como 

c -> continuar la ejecución

q -> salir del depurador/ejecución

n -> paso a la siguiente línea dentro de la misma función

s -> paso a la siguiente línea en esta función o una función llamada

Para saber más sobre los diferentes comandos, puede escribir ayuda y obtener la información requerida.

Ahora, seguiremos ejecutando nuestro programa con la ayuda del comando n.

De manera similar, podemos usar el método breakpoint() (que no necesita importar pdb).

Python3

# a simple function
def fxn(n):
    for i in range(n):
        print("Hello! ", i+1)
  
  
# using breakpoint
breakpoint()
fxn(5)

Producción:

Funciones proporcionadas por la depuración de PDB

1. Impresión de variables o expresiones

Al utilizar el orden de impresión p, está pasando una articulación para que Python la evalúe. Si pasa un nombre de variable, pdb imprime su valor actual. No obstante, puede hacer mucho más para examinar el estado de su aplicación en ejecución.

Una aplicación de depuración de PDB en la recursividad para verificar variables.

En este ejemplo, definiremos una función recursiva con pdb trace y verificaremos los valores de las variables en cada llamada recursiva. Para imprimir el valor de la variable, usaremos una palabra clave de impresión simple con el nombre de la variable.

Python3

# importing pdb
import pdb
  
# define recursive function
def rec_fxn(r):
    if r > 0:
  
        # set trace
        pdb.set_trace()
        rec_fxn(r//2)
    else:
        print("recursion stops")
    return
  
# set trace at start
pdb.set_trace()
rec_fxn(5)

Producción:

Un ejemplo para verificar expresiones

Este ejemplo es similar al ejemplo anterior, que imprime los valores de las expresiones después de su evaluación.

Python3

# importing pdb
import pdb
  
# simple function
def fxn(n):
    l=[]
    for i in range(n):
        l.append(i)
  
    # set trace
    pdb.set_trace()
    return
  
fxn(5)

Producción:

2. Moviéndose en código por pasos

Esta es la característica más importante proporcionada por pdb. Para ello se utilizan los dos comandos principales que se indican a continuación:

n -> paso a la siguiente línea dentro de la misma función

s -> paso a la siguiente línea en esta función o una función llamada

Comprendamos el funcionamiento de estos con la ayuda de un ejemplo.

Python3

# importing pdb
import pdb
  
# simple function
def fxn(n):
    l = []
    for i in range(n):
        l.append(i)
    return
  
  
# set trace
pdb.set_trace()
fxn(5)

Salida usando n:

Salida usando s:

3. Uso de puntos de interrupción

Esta función nos ayuda a crear puntos de interrupción dinámicamente en una línea particular del código fuente. Aquí, en este ejemplo, estamos creando un punto de interrupción usando el comando b que se muestra a continuación:

b(reak) [ ([filename:]lineno | function) [, condition] ]
        Without argument, list all breaks.

Con un argumento de número de línea, establezca un corte en esta línea en el archivo actual. Con un nombre de función, establezca un descanso en la primera línea ejecutable de esa función. Si hay un segundo argumento presente, es una string que especifica una expresión que debe evaluarse como verdadera antes de que se respete el punto de interrupción.

El número de línea puede tener como prefijo un nombre de archivo y dos puntos, para especificar un punto de interrupción en otro archivo (probablemente uno que aún no se haya cargado). El archivo se busca en sys.path; se puede omitir el sufijo .py.

Python3

# importing pdb
import pdb
  
# simple function
def fxn(n):
    l = []
      
    for i in range(n):
        l.append(i)
    print(l)
    return
  
  
# set trace
pdb.set_trace()
fxn(5)

Producción:

4. Ejecutar código hasta la línea especificada

Use unt para continuar con la ejecución como c, sin embargo, deténgase en la siguiente línea más notable que la línea actual. De vez en cuando, unt es más útil y más rápido de utilizar y, de hecho, es lo que necesita.

unt(il) [lineno]

Sin argumento, continúa la ejecución hasta llegar a la línea con un número mayor que el actual. Con un número de línea, continúa la ejecución hasta llegar a una línea con un número mayor o igual a ese. En ambos casos, también deténgase cuando regrese el cuadro actual.

Python3

# importing pdb
import pdb
  
# simple function
def fxn(n):
    
    # set trace
    pdb.set_trace()
    l = []
      
    for i in range(n):
        l.append(i)
    print(l)
    return
  
  
fxn(5)

Producción:

5. Indique el código

El código fuente de la lista es otra característica que se puede usar para rastrear el código con un número de línea como una lista. Para esto se usa el comando ll.

lista larga | ll -> Muestra el código fuente completo para la función o marco actual.

Comprendamos el funcionamiento de longlist con la ayuda de un ejemplo.

Python3

# importing pdb
import pdb
  
# simple function
def fxn(n):
    l=[]
  
    for i in range(n):
        l.append(i)
    return
  
# set trace
pdb.set_trace()
fxn(5)

Producción:

6. Visualización de expresiones

Al igual que la impresión de articulaciones con p y pp, puede utilizar la orden mostrar [expresión] para indicar a pdb que muestre automáticamente el valor de una articulación, si cambia, cuando se detiene la ejecución. Utilice la orden undisplay [expresión] para borrar una articulación de presentación.

display [expression]

Muestra el valor de la expresión si cambió, cada vez que la ejecución se detiene en el cuadro actual. Sin expresión, enumere todas las expresiones de visualización para el cuadro actual.

undisplay [expression]

No mostrar más la expresión en el marco actual. Sin expresión, borre todas las expresiones de visualización para el cuadro actual.

Python3

# importing pdb
import pdb
  
# simple function
def fxn(n):
    l = []
      
    for i in range(n):
        l.append(i)
      
    # set trace
    pdb.set_trace()
    print(l)
    return
  
  
fxn(5)

Producción:

7. Cuadros arriba-abajo

Aquí, podemos jugar con cada trazo como un marco, y también podemos movernos de un marco a otro.

w(here)

Imprima un seguimiento de la pila, con el cuadro más reciente en la parte inferior. Una flecha indica el «fotograma actual», que determina el contexto de la mayoría de los comandos. ‘bt’ es un alias para este comando.

u(p) [count]

Mueva el recuento de fotogramas actual (uno predeterminado) niveles hacia arriba en el seguimiento de la pila (a un fotograma más antiguo).

d(own) [count]

Mueva el recuento de fotogramas actual (el predeterminado) niveles hacia abajo en el seguimiento de la pila (a un fotograma más nuevo).

Python3

# importing pdb
import pdb
  
# simple function
def fxn(i):
    print(i)
    return
  
# set trace
pdb.set_trace()
for i in range(5):
    fxn(i)

Producción:

Publicación traducida automáticamente

Artículo escrito por deepanshu_rustagi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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