Si lo entiendo correctamente, ¿quiere una abreviatura para imprimir un nombre de variable y su valor en el alcance actual? En general, esto es imposible sin utilizar la función de rastreo de intérpretes o sys._getframe, que en general solo debe utilizarse si sabe lo que está haciendo. La razón de esto es que la función de impresión no tiene otra manera de conseguir los locales del ámbito de llamar:
def a():
x = 1
magic_print("x") #will not work without accessing the current frame
lo que puede hacer sin que éstos se pasan de forma explícita a los locales a una función como esta:
def printNameAndValue(varname, values):
print("%s=%s" % (varname, values[varname]))
def a():
x = 1
printNameAndValue("x", locals()) #prints 'x=1'
EDIT:
ver la respuesta por catchemifyoutry de una solución mediante el módulo de inspección (que utiliza internamente sys._getframe).Para completar una solución utilizando la función de rastreo directamente - útil si estás usando Python 2.0 e inspeccionar no está disponible;)
from sys import settrace
__v = {} #global dictionary that holds the variables
def __trace(frame, event, arg):
""" a trace function saving the locals on every function call """
global __v
if not event == "call":
return __trace
__v.update(frame.f_back.f_locals)
def enableTrace(f):
""" a wrapper decorator setting and removing the trace """
def _f(*a, **kwa):
settrace(__trace)
try:
f(*a, **kwa)
finally:
settrace(None)
return _f
def printv(vname):
""" the function doing the printing """
global __v
print "%s=%s" % (vname, __v[vname])
guardarlo en un módulo y utilizar así:
from modulenamehere import enableTrace, printv
@enableTrace
def somefunction():
x = 1
[...]
printv("x")
Python se escribe de forma dinámica, por lo que la respuesta es "Sí, por supuesto!". La respuesta larga depende de lo que haya intentado, ¿podría compartir lo que hizo y lo que salió mal y lo que esperaba en su lugar? –
que han intentado varias cosas, aquí es donde estoy tratando de imprimir la cadena y el número de coma flotante, pero los resultados en la impresión de punto flotante y sin cadena: – malby
def PrintMe (a): b = '% s', una print b return b – malby