1

Pythonでメソッドの実行をトレースしたい場合は、次のデコレータを実装します。

def trace(f):
    indent = '   '
    def _f(*args):
        signature = '%s(%s)' % (f.__name__, ', '.join(map(repr, args)))
        print '%s--> %s' % (trace.level*indent, signature)
        trace.level += 1
        try:
            result = f(*args)
            print '%s<-- %s == %s' % ((trace.level-1)*indent, signature, result)
        finally:
            trace.level -= 1
        return result
    trace.level = 0
    return _f

def disabled(f) : return f

# uncomment the following line to disable tracing
# trace = disabled

次に、トレースしたいメソッドを装飾できます。

@trace
def my_method(arg1, arg2):
...

もう1つの可能性は、トレースモジュールを使用することです

Scalaでメソッドの実行を追跡する慣用的な方法は何ですか?

4

1 に答える 1

1

Pythonの関数デコレータは、と言うための単なる構文糖衣ですmy_method = trace(my_method)。Scalaはファーストクラスの関数もサポートしているので、実際には同じことができます。

ただし、1つの問題があります。Pythonは型指定されていないため、関数の型シグネチャが何であるかは関係ありません。Scalaはこれを気にします。Scalaには引数リストのアリティごとに関数特性があるため、問題を少し回避することができFunction0ますFunction22。他の人はもっと良いアイデアを持っているかもしれませんが、trace関数型ごとにメソッド(または大きなものを持つ1つのトレースメソッドmatch)を記述してから、トレースメソッドを介して関数を呼び出すことができます。ジェネリックスを使用して型を無視できるため、引数の数だけを気にする必要があります。

于 2012-09-26T03:14:27.780 に答える