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

Trace specific functions in Python to capture high-level execution flow

Python 通过其 trace module. There are also custom solutions like this 提供追踪。但是这些方法捕获了您使用的 most/every 库内外的大多数低级执行。除了深入调试之外,这不是很有用。

最好能有一些东西只捕获管道中布置的最高级别的功能。例如,如果我有:

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)

它使用 class 变量 level 来跟踪调用了多少函数,并简单地打印出带有 space indent 的函数名称。所以调用 funct1 得到:

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

根据您想要保存输出的方式,您可以使用日志模块进行输出