问题描述
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
根据要保存输出的方式,可以将日志记录模块用于输出