2012-09-26 121 views
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): 
... 

另一種可能將使用a trace module

在Scala中跟蹤方法執行的慣用方法是什麼?

回答

1

Python中的函數裝飾器只是用於說my_method = trace(my_method)的語法糖。既然Scala也支持一流的功能,你實際上可以做同樣的事情。

但是有一個問題。由於Python是無類型的,所以函數的類型簽名是無關緊要的。斯卡拉關心這一點。你可以解決這個問題,因爲Scala對每個參數列表元素都有一個函數特徵:Function0Function22。其他人可能會有更好的想法,但是您可以爲每個函數類型(或其中一個大的match)中的一個跟蹤方法編寫trace方法,然後通過跟蹤方法調用您的函數。您只需要擔心參數的數量,因爲您可以使用泛型忽略它們的類型。