2015-08-14 2 views
15

Quando il debug, vediamo spesso dichiarazioni di stampa come queste:Python: stampa il nome e il valore di una variabile?

print x  # easy to type, but no context 
print 'x=',x # more context, harder to type 
12 
x= 12 

Come si può scrivere una funzione che avrà una variabile o il nome di una variabile e stampare il suo nome e il valore? Sono interessato esclusivamente al debug dell'output, questo non sarà incorporato nel codice di produzione.

debugPrint(x) # or 
debugPrint('x') 
x=12 
+0

'print ("% s =% s "% (nome, eval (nome)))' (yuck)? – Blorgbeard

+1

possibile duplicato di [Come si può stampare un nome di variabile in python?] (Http://stackoverflow.com/questions/592746/how-can-you-print-a-variable-name-in-python) – Andy

+3

Don ' lo faccio! Usa un debugger! :) – jme

risposta

8

Si può semplicemente utilizzare eval:

def debug(variable): 
    print variable, '=', repr(eval(variable)) 

o più in generale (che effettivamente funziona nel contesto della funzione di chiamata e non si rompe sulla debug('variable'), ma solo su CPython):

from __future__ import print_function 

import sys 

def debug(expression): 
    frame = sys._getframe(1) 

    print(expression, '=', repr(eval(expression, frame.f_globals, frame.f_locals))) 

E si può fare:

>>> x = 1 
>>> debug('x + 1') 
x + 1 = 2 
+0

Perché i downvotes? Se riguarda la sicurezza di 'eval', non vedo perché questo è un problema perché questo non sarà mai nel codice di produzione. –

+0

soluzione molto semplice e funzionante, esattamente ciò di cui ho bisogno – Oleg

0

abbastanza brutto, ma non il lavoro:

import inspect, re 
def getm(p): 
    for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]: 
    match = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line) 
    if match: 
     return match.group(1) 
x=21 
search = getm(x); 
print (search , '=' , eval(search)) 
2
import inspect 
import re 
def debugPrint(x): 
    frame = inspect.currentframe().f_back 
    s = inspect.getframeinfo(frame).code_context[0] 
    r = re.search(r"\((.*)\)", s).group(1) 
    print("{} = {}".format(r,x)) 

Questo non funziona per tutte le versioni di pitone:

inspect.currentframe()

implementazione CPython dettaglio:Questa funzione si basa sul supporto del frame stack Python nell'interprete, che non è garantito che esista in tutti gli imp lementazioni di Python. Se è in esecuzione in un'implementazione senza il supporto per lo stack frame Python, questa funzione restituisce None.