あなたが正しく理解している場合、現在のスコープで変数名とその値を出力するための省略形が必要ですか? これは一般に、インタプリタの trace 関数または sys._getframe を使用しないと不可能です。これは、一般に、自分が何をしているのかを知っている場合にのみ使用する必要があります。これは、print 関数が呼び出しスコープからローカル変数を取得する方法が他にないためです。
def a():
x = 1
magic_print("x") #will not work without accessing the current frame
これらなしでできることは、ローカルを次のような関数に明示的に渡すことです。
def printNameAndValue(varname, values):
print("%s=%s" % (varname, values[varname]))
def a():
x = 1
printNameAndValue("x", locals()) #prints 'x=1'
編集:
inspect モジュール (内部的に sys._getframe を使用) を使用したソリューションについては、catchemifyoutry による回答を参照してください。完全を期すために、trace 関数を直接使用したソリューション - Python 2.0 を使用していて、inspect が利用できない場合に役立ちます;)
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])
モジュールに保存して、次のように使用します。
from modulenamehere import enableTrace, printv
@enableTrace
def somefunction():
x = 1
[...]
printv("x")