跟踪 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
我看过:
- trace
- tracefunc
- sys.settrace
- trace.py
我很乐意在脚本中手动标记函数,就像我们对 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
根据您想要保存输出的方式,您可以使用日志模块进行输出
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
我看过:
- trace
- tracefunc
- sys.settrace
- trace.py
我很乐意在脚本中手动标记函数,就像我们对 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
根据您想要保存输出的方式,您可以使用日志模块进行输出