13

Unixコマンドライン/ sshセッションで小さなPythonスクリプトを迅速に開発/デバッグしながら、変数名と値をすばやく出力する方法を探しています。

variable_nameこれは非常に一般的な要件のようであり、その値を表示または記録するすべての行で sを複製するのは (キーストロークと時間/エネルギーの点で) 無駄に思えます。つまり、というより

print 'my_variable_name:', my_variable_name

strintlist、に対して次のことができるようにしたいdict:

log(my_variable_name)
log(i)
log(my_string)
log(my_list)

次の出力を取得します。

my_variable_name:some string
i:10
my_string:a string of words
my_list:[1, 2, 3]

理想的には、出力には関数名も記録されます。

locals、 、フレームなどを使用しようとするソリューションを見てきglobalsましたが、int、文字列、リストで機能し、関数内でも機能するものはまだ見たことがありません。

ありがとう!

4

3 に答える 3

7

必要なツールが開発とデバッグ専用である場合は、qという便利なパッケージがあります。

pypi に提出されており、pip install qまたはでインストールできますeasy_install q

import q; q(foo)

# use @q to trace a function's arguments and return value
@q
def bar():
   ...

# to start an interactive console at any point in your code:
q.d()

結果はデフォルトでファイル/tmp/q(または任意のカスタマイズされたパス) に出力されるため、標準出力および通常のログと混在することはありません。で出力を確認できますtail -f /tmp/q。出力はさまざまな色で強調表示されます。

著者は、PyconUS 2013 のライトニング トークで彼のライブラリを紹介しました。ビデオはこちら、25:15 から始まります

于 2013-10-11T12:41:06.997 に答える
4

これは別の邪悪なハックです:

import inspect

def log(a):
    call_line = inspect.stack()[1][4][0].strip()
    assert call_line.strip().startswith("log(")
    call_line = call_line[len("log("):][:-1]
    print "Log: %s = %s" % (call_line, a)

b=3
log(b)

これには明らかに、いくつかの範囲チェック、より良い解析などが必要です。また、呼び出しが常に同じ方法で行われ、おそらくもっと多くの-私にはわからない-仮定がある場合にのみ機能します...

于 2013-10-11T12:36:45.987 に答える
0

文字列の変数の名前を単純に取得する方法がわかりません。ただし、現在の関数ログの引数のリストを取得できます。

import inspect

def log(a):
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
    print "%s:%s" % (args[0], values[args[0]])
于 2013-10-11T12:16:57.353 に答える