跟踪Python中的特定函数以捕获高层执行流

问题描述

Python提供了通过其trace模块进行跟踪的功能。还有一些自定义解决方案,例如this。但是这些方法捕获了大多数低级执行,包括您所使用的大多数/每个库的内里外。除了深度调试之外,这不是很有用。

最好只捕获管道中布置的最高级功能。例如,如果我有

def funct1():
    res = funct2()
    print(res)

def funct2():
    factor = 3
    res = funct3(factor)
    return(res)

def funct3(factor):
    res = 1 + 100*factor
    return(res)

...并称为:

funct1()

...很容易捕获:

function order:
    - funct1
    - funct2
    - funct3

我看过:

我很高兴在脚本中手动标记函数,就像对Docstrings一样。有没有一种方法可以将“挂钩”添加函数中,然后在调用它们时对其进行跟踪?

解决方法

您始终可以使用装饰器来跟踪调用了哪些函数。这是一个示例,可让您跟踪在什么位置调用函数的嵌套级别:

class Tracker:
    level = 0

    def __init__(self,indent=2):
        self.indent = indent

    def __call__(self,fn):
        def wrapper(*args,**kwargs):
            print(' '*(self.indent * self.level) + '-' + fn.__name__)
            self.level += 1
            out = fn(*args,**kwargs)
            self.level -= 1
            return out
        return wrapper


track = Tracker()

@track
def funct1():
    res = funct2()
    print(res)

@track
def funct2():
    factor = 3
    res = funct3(factor)
    return(res)

@track
def funct3(factor):
    res = 1 + 100*factor
    return(res)

它使用类变量level跟踪已调用了多少个函数,并简单地用空格indent打印出函数名。因此,调用funct1可以得出:

funct1()
# prints:
-funct1
  -funct2
    -funct3
# returns:
301

根据要保存输出的方式,可以将日志记录模块用于输出