如果我想跟踪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):
...
另一种可能性是使用a trace module。
在Scala中跟踪方法执行的惯用方法是什么?
答案 0 :(得分:1)
Python中的函数装饰器只是说my_method = trace(my_method)
的语法糖。由于Scala也支持一流的功能,你实际上可以做同样的事情。
然而,有一个问题。由于Python是无类型的,因此函数的类型签名无关紧要。斯卡拉关心这一点。你可以解决一下这个问题,因为Scala对每个参数列表arity都有一个函数特征:Function0
到Function22
。其他人可能有更好的想法,但您可以为每个函数类型(或其中包含大trace
的一个跟踪方法)编写match
方法,然后通过trace方法调用您的函数。您只需要担心参数的数量,因为您可以使用泛型来忽略它们的类型。