2010-05-11 10 views
11

me encuentro adición de depuración declaraciones de "imprimir" muy a menudo - cosas como esta:Impresión de nombres y contenidos de variables como herramienta de depuración; en busca de emacs/Python atajo

print("a_variable_name: %s" % a_variable_name) 

¿Cómo se hace eso todo? ¿Estoy siendo neurótico al tratar de encontrar una manera de optimizar esto? Puede que esté trabajando en una función y coloque una media docena de esas líneas, descubra por qué no funciona y luego recórtelas de nuevo.

¿Has desarrollado una forma eficiente de hacer eso?

Estoy codificando Python en Emacs.

+0

Después de todos estos años y tropezando nuevamente con esta pregunta, finalmente lo entiendo, ¡lo que necesitábamos todo el tiempo eran macros sintácticas! es decir. en [# julia-lang] (http://stackoverflow.com/questions/tagged/julia-lang): '@show foo = 1.0 + 3im/2' prints; 'foo = 1.0 + (3im)/2 = 1.0 + 1.5im', donde '@ show' es una macro y se puede usar para anotar cualquier expresión (en Julia todo es una expresión), puede ver el código generado a partir de la expansión de macro aquí: https://git.io/vgDch I encontré esta implementación de macros sintácticas para Python: https://github.com/lihaoyi/macropy pero la metaprogramación de Julia es la mejor! – SalchiPapa

Respuesta

8

A veces, un depurador es excelente, pero a veces el uso de declaraciones de impresión es más rápido y más fácil de configurar y usar repetidamente.

Esto sólo puede ser adecuado para la depuración con CPython (ya que no todos los pitones implementan inspect.currentframe y inspect.getouterframes), pero me parece que esto útil para la reducción en la tipificación:

En utils_debug.py:

import inspect  
def pv(name): 
    record=inspect.getouterframes(inspect.currentframe())[1] 
    frame=record[0] 
    val=eval(name,frame.f_globals,frame.f_locals) 
    print('{0}: {1}'.format(name, val)) 

Luego, en su script.py:

from utils_debug import pv 

Con esta configuración, se puede reemplazar

print("a_variable_name: %s' % a_variable_name) 

con

pv('a_variable_name') 

Tenga en cuenta que el argumento de pv debería ser la cadena (nombre de la variable, o expresión), no el valor en sí.

Para eliminar estas líneas usando Emacs, se podría

C-x ( # start keyboard macro 
C-s pv(' 
C-a 
C-k  # change this to M-; if you just want to comment out the pv call 
C-x) # end keyboard macro 

A continuación, puede llamar a la macro una vez con C-x e o mil veces con C-u 1000 C-x e

Por supuesto, hay que tener cuidado de que de hecho, quiero eliminar todas las líneas que contienen pv('.

+0

Es posible que su forma no sea muy elegante, pero me parece bastante útil, ya que tengo la misma necesidad que Schof, es decir, evitar el tipeo redundante al depurar las variables –

+0

, sé que esta es una respuesta antigua, por lo que las cosas podrían haber cambiado. Pero me encontré con esto con Google, así que lo dejo aquí. Ahora puedes hacer directamente 'frame = inspect.currentframe(). F_back', que es un poco más claro y claro :) – Santiago

1

No hagas eso. Use un depurador decente en su lugar. La manera más fácil de hacerlo es usar IPython y esperar una excepción (el depurador se activará automáticamente), o provocar uno ejecutando una declaración ilegal (por ejemplo, 1/0) en la parte del código que desea inspeccionar .

+0

+1 para utilizar la herramienta adecuada, está tratando de clavar un clavo con una navaja suiza –

Cuestiones relacionadas