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):
...

另一种可能性是使用跟踪模块

在 Scala 中跟踪方法执行的惯用方法是什么?

4

1 回答 1

1

Python 中的函数装饰器只是说my_method = trace(my_method). 由于 Scala 还支持一流的函数,因此您实际上可以做同样的事情。

然而,有一个问题。由于 Python 是无类型的,因此函数的类型签名是什么并不重要。Scala 关心这一点。你可以稍微绕过这个问题,因为 Scala 对每个参数列表 arity 都有一个函数特征:Function0through Function22。其他人可能有更好的想法,但是您可以trace为每种函数类型编写一个方法(或一个包含 bigmatch的跟踪方法),然后通过跟踪方法调用您的函数。您只需要担心参数的数量,因为您可以使用泛型来忽略它们的类型。

于 2012-09-26T03:14:27.780 回答