
在Python开发中,我们经常需要调试代码,检查函数间的调用关系,本文使用内置的inspect模块介绍如何获取函数间的调用关系。
功能:返回当前调用栈的信息(函数调用层次),包含每个栈帧的文件名、行号、函数名等,常用于调试工具或日志记录。
返回:函数返回的是包含多个FrameInfo对象的列表,每个FrameInfo对象是包含Frame对象,调用文件名,行号,函数名,index的元组。
参数名 | 类型 | 是否必填 | 说明 |
context | int | 否 | 每个栈帧返回的上下文行数,默认 1 |
import inspectdef func_c():# 在最内层函数打印调用栈stack = inspect.stack(context=2) # 获取2行上下文print("当前调用栈信息:")for i, frame in enumerate(stack):#frame是一个元组,包含帧对象、文件名、行号、函数名、indexframe_obj, file, line, func, code_context, index = frameprint(f"----栈帧 {i}:")print(f"文件:{file}")print(f"行号:{line}")print(f"函数:{func}")print(f"上下文代码:{code_context}")def func_b():func_c() # 调用 func_cdef func_a():func_b() # 调用 func_b# 触发调用链func_a()
python内置inspect轻松获取函数调用关系2025-10-29 07:49·科雷learning作品声明:个人观点、仅供参考在Python开发中,我们经常需要调试代码,检查函数间的调用关系,本文使用内置的inspect模块介绍如何获取函数间的调用关系。inspect.stack(context=1):获取调用栈信息功能:返回当前调用栈的信息(函数调用层次),包含每个栈帧的文件名、行号、函数名等,常用于调试工具或日志记录。返回:函数返回的是包含多个FrameInfo对象的列表,每个FrameInfo对象是包含Frame对象,调用文件名,行号,函数名,index的元组。参数说明参数名类型是否必填说明contextint否每个栈帧返回的上下文行数,默认 1案例:在python文件内部打印函数调用栈import inspectdef func_c():# 在最内层函数打印调用栈stack = inspect.stack(context=2) # 获取2行上下文print("当前调用栈信息:")for i, frame in enumerate(stack):#frame是一个元组,包含帧对象、文件名、行号、函数名、indexframe_obj, file, line, func, code_context, index = frameprint(f"----栈帧 {i}:")print(f"文件:{file}")print(f"行号:{line}")print(f"函数:{func}")print(f"上下文代码:{code_context}")def func_b():func_c() # 调用 func_cdef func_a():func_b() # 调用 func_b# 触发调用链func_a()
----栈帧 0:文件:/xxx/pythonProject/inspect_test.py行号:7函数:func_c上下文代码:[' # 在最内层函数打印调用栈\n', ' stack = inspect.stack(context=2) # 获取 2 行上下文\n']----栈帧 1:文件:/xxx/pythonProject/inspect_test.py行号:20函数:func_b上下文代码:['def func_b():\n', ' func_c() # 调用 func_c\n']----栈帧 2:文件:/xxx/pythonProject/inspect_test.py行号:23函数:func_a上下文代码:['def func_a():\n', ' func_b() # 调用 func_b\n']----栈帧 3:文件:/xxx/pythonProject/inspect_test.py行号:25函数:<module>上下文代码:['\n', 'func_a()\n']
import inspect
def func_c():
# 在最内层函数打印调用栈
stack = inspect.stack(context=2) # 获取2行上下文
print("当前调用栈信息:")
for i, frame in enumerate(stack):
#frame是一个元组,包含帧对象、文件名、行号、函数名、index
frame_obj, file, line, func, code_context, index = frame
print(f"----栈帧 {i}:")
print(f"文件:{file}")
print(f"行号:{line}")
print(f"函数:{func}")
print(f"上下文代码:{code_context}")
def func_b():
func_c() # 调用 func_c
def func_a():
func_b() # 调用 func_b准备另一个python文件引用上面的模块inspect_test.py:
import inspect_test
def func_d():
inspect_test.func_a() # 调用 func_c
# 触发调用链
func_d()输出调用关系:
----栈帧 0:
文件:/xxx/pythonProject/inspect_test.py
行号:7
函数:func_c
上下文代码:[' # 在最内层函数打印调用栈\n', ' stack = inspect.stack(context=2) # 获取 2 行上下文\n']
----栈帧 1:
文件:/xxxx/pythonProject/inspect_test.py
行号:20
函数:func_b
上下文代码:['def func_b():\n', ' func_c() # 调用 func_c\n']
----栈帧 2:
文件:/xxx/pythonProject/inspect_test.py
行号:23
函数:func_a
上下文代码:['def func_a():\n', ' func_b() # 调用 func_b\n']
----栈帧 3:
文件:/xxx/pythonProject/inspect_test2.py
行号:5
函数:func_d
上下文代码:['def func_d():\n', ' inspect_test.func_a() # 调用 func_c\n']
----栈帧 4:
文件:/xxx/pythonProject/inspect_test2.py
行号:9
函数:<module>
上下文代码:['# 触发调用链\n', 'func_d()\n']这样我们就能针对某些函数轻松获取其对应的调用关系了。