代码之家  ›  专栏  ›  技术社区  ›  Cybernetic

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

  •  2
  • Cybernetic  · 技术社区  · 4 年前

    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
    

    我看过:

    1 回复  |  直到 4 年前
        1
  •  1
  •   James    4 年前

    您可以始终使用decorator来跟踪调用了哪些函数。下面是一个示例,它允许您跟踪调用函数的嵌套级别:

    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
    

    根据您希望如何保存输出,您可以将日志模块用于输出