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
相关产品推荐
相关产品推荐

