Python – sys.settrace()

El módulo de Python sysproporciona algunas de las funciones poderosas, pero son complejas de entender. Uno de los cuales es el sys.settrace()que se utiliza para implementar depuradores, perfiladores y herramientas de cobertura. Esto es específico del subproceso y debe registrar el seguimiento mediante threading.settrace().

Saber cómo funciona internamente la función es realmente importante en caso de que planee crear su propio depurador.

En un nivel superior, sys.settrace()registra el rastreo al intérprete de Python. Un rastreo es básicamente la información que se devuelve cuando ocurre un evento en el código. Es posible que haya visto tracebackcuando su código tiene algún error o se genera una excepción.

El rastreo registrado se invoca cuando ocurre uno de los siguientes cuatro eventos:

  1. La función se llama
  2. Función devuelve
  3. Ejecución de una línea.
  4. Se levanta una excepción

Sintaxis: sys.settrace(marco, evento, arg.marco)

Parámetros:
marco: el marco es el evento de marco de pila actual
: una string que puede ser 'call', 'line', 'return', 'exception'o 'opcode'
arg: depende del tipo de evento

Devoluciones: referencia a la función de seguimiento local que luego devuelve una referencia a sí misma.

Ejemplo:

Vamos a crear nuestra propia función de rastreo local con line, function and calleventos. Estos eventos se destacan en el siguiente código dado.

# program to display the functioning of
# settrace()
from sys import settrace
  
  
# local trace function which returns itself
def my_tracer(frame, event, arg = None):
    # extracts frame code
    code = frame.f_code
  
    # extracts calling function name
    func_name = code.co_name
  
    # extracts the line number
    line_no = frame.f_lineno
  
    print(f"A {event} encountered in \
    {func_name}() at line number {line_no} ")
  
    return my_tracer
  
  
# global trace function is invoked here and
# local trace function is set for fun()
def fun():
    return "GFG"
  
  
# global trace function is invoked here and
# local trace function is set for check()
def check():
    return fun()
  
  
# returns reference to local
# trace function (my_tracer)
settrace(my_tracer)
  
check()

Producción:

A call encountered in check() at line number 30 
A line encountered in check() at line number 31 
A call encountered in fun() at line number 24 
A line encountered in fun() at line number 25 
A return encountered in fun() at line number 25 
A return encountered in check() at line number 31 

Quizás se pregunte por qué la función local se my_codedevuelve a sí misma.
La razón está oculta en el funcionamiento de sys.settrace(). Lo sys.settraceque hace es que primero registra un seguimiento global que se llama cada vez que se crea un marco que devuelve nuestra función de seguimiento local my_tracecada vez que ocurre cualquiera de los eventos mencionados anteriormente. Para una mejor comprensión, observe la imagen que se muestra a continuación:

Working-of-settrace-python

Si no queremos que se rastree nuestro alcance, entonces Nonedebe devolverse, pero si ese no es el caso, es posible que deseemos hacer lo mismo con nuestra función de rastreo local, entonces debería regresar Nonesi hay un error, entonces settrace(None)se llama automáticamente.

Nota: hay una función nombrada gettracedisponible en sysel módulo para obtener el conjunto de seguimiento porsys.settrace()

Publicación traducida automáticamente

Artículo escrito por nishkarsh146 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 *