Skip to the content.

Python sys._getframe

因代码需要封装了一个日志函数, 想记录当前被调用函数的名称所处模块,以及被调用代码行,因此了解到sys_getframe函数.

sys._getframe([depth])[^链接1]

从调用堆栈返回一个对象结构。 如果给出了可选的整数 depth,则返回在堆栈顶部以下调用多次的对象。 如果它比调用堆栈更深,则会引发 ValueErrordepth 的默认值为零,返回调用堆栈顶部的结构。

import sys

def test_func():
    caller = sys._getframe(1)
    file_name = caller.f_code.co_filename  # 获取调用函数名所在路径
    func_name = caller.f_code.co_name  # 获取调用函数名
    line_number = caller.f_lineno  # 获取调用函数行号
    print(f"被调用函数名路径: {file_name}")
    print(f"被调用函数名: {func_name}")
    print(f"被调用函数行号: {line_number}")
    
    cur_func = sys._getframe()
    file_name = cur_func.f_code.co_filename  # 获取调用函数名所在路径
    func_name = cur_func.f_code.co_name  # 获取调用函数名
    line_number = cur_func.f_lineno  # 获取调用函数行号; 结果为当前行
    print(f"当前函数名路径: {file_name}")
    print(f"当前函数名: {func_name}")
    print(f"当前函数行号: {line_number}")


def caller_func():
    test_func()

if __name__ == '__main__':
    caller_func()

参考链接