You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何获取当前及调用函数的名称、文件路径等信息?

简易日志工具:函数调用信息获取整合实现

下面是整合了当前函数信息与调用函数信息的实用代码示例,基于Python的inspect模块实现,可直接嵌入日志工具:

一、获取当前函数的完整信息

通过inspect.currentframe()和inspect.getframeinfo()可以拿到当前执行函数的名称、参数、文件路径等信息:

import inspect

def get_current_func_info():
    frame = inspect.currentframe()
    try:
        # 获取当前函数的帧信息
        frame_info = inspect.getframeinfo(frame)
        # 获取当前函数名
        func_name = frame_info.function
        # 获取函数参数详情
        argspec = inspect.getfullargspec(frame.f_code)
        
        return {
            "func_name": func_name,
            "args": argspec.args,
            "varargs": argspec.varargs,
            "varkw": argspec.varkw,
            "file_path": frame_info.filename,
            "file_name": frame_info.filename.split("/")[-1]
        }
    finally:
        # 手动释放帧引用,避免内存泄漏
        del frame

使用示例

def test_func(a, b, *args, **kwargs):
    info = get_current_func_info()
    print(f"当前函数:{info['func_name']}")
    print(f"参数列表:{info['args']}")
    print(f"可变参数:{info['varargs']}")
    print(f"关键字可变参数:{info['varkw']}")
    print(f"所属文件:{info['file_name']}({info['file_path']})")

test_func(1, 2, 3, 4, name="test")

二、获取调用函数的信息

通过inspect.stack()获取调用栈,取栈的第2层(索引1)即可拿到调用当前函数的上层函数信息:

def get_caller_func_info():
    stack = inspect.stack()
    try:
        # 栈索引0是当前函数本身,索引1是调用者
        caller_frame = stack[1]
        caller_frame_info = inspect.getframeinfo(caller_frame[0])
        
        return {
            "caller_func_name": caller_frame_info.function,
            "caller_file_path": caller_frame_info.filename,
            "caller_file_name": caller_frame_info.filename.split("/")[-1],
            "caller_line_no": caller_frame_info.lineno
        }
    finally:
        # 释放栈引用
        del stack

使用示例

def log_tool():
    caller_info = get_caller_func_info()
    print(f"调用函数:{caller_info['caller_func_name']}")
    print(f"调用文件:{caller_info['caller_file_name']}({caller_info['caller_file_path']})")
    print(f"调用行号:{caller_info['caller_line_no']}")

def business_logic():
    log_tool()  # 调用日志工具

business_logic()

三、整合到日志工具中

将两个函数结合,写一个通用的日志装饰器,自动记录函数调用上下文:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        current_info = get_current_func_info()
        caller_info = get_caller_func_info()
        
        log_content = (
            f"[日志记录]\n"
            f"当前执行函数:{current_info['func_name']}\n"
            f"函数参数:{current_info['args']}\n"
            f"调用来源:{caller_info['caller_func_name']} | {caller_info['caller_file_name']}:{caller_info['caller_line_no']}\n"
            f"----------------------------------------"
        )
        print(log_content)
        return func(*args, **kwargs)
    return wrapper

# 使用装饰器
@log_decorator
def user_login(username, password):
    print(f"用户{username}登录验证中...")

def main():
    user_login("admin", "123456")

main()

内容的提问来源于stack exchange,提问作者JamesC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:22:05