当前位置:首页>python>python内置inspect轻松获取函数调用关系

python内置inspect轻松获取函数调用关系

  • 2026-10-11 08:38:56
python内置inspect轻松获取函数调用关系

在Python开发中,我们经常需要调试代码,检查函数间的调用关系,本文使用内置的inspect模块介绍如何获取函数间的调用关系。

inspect.stack(context=1):获取调用栈信息

功能:返回当前调用栈的信息(函数调用层次),包含每个栈帧的文件名、行号、函数名等,常用于调试工具或日志记录。

返回:函数返回的是包含多个FrameInfo对象的列表,每个FrameInfo对象是包含Frame对象,调用文件名,行号,函数名,index的元组。

参数说明

参数名

类型

是否必填

说明

context

int

否

每个栈帧返回的上下文行数,默认 1

案例:在python文件内部打印函数调用栈

import inspectdef 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_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是一个元组,包含帧对象、文件名、行号、函数名、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_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']

案例:在python文件内引用其它模块的函数,打印函数调用栈

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']

这样我们就能针对某些函数轻松获取其对应的调用关系了。

最新文章

随机文章