Python如何动态获取当前模块、类及函数名称用于日志输出?
在Python中动态获取模块、函数名称用于日志输出
刚好我之前也做过类似的需求,其实Python本身提供了不少内置属性和模块来帮我们实现这个功能,不用硬编码名称,完全可以动态获取。下面分步骤给你讲清楚:
一、基础实现:获取模块名+函数名
要实现你要的效果,我们可以结合os模块和inspect模块(或者用Python的内部栈信息)来获取这些名称,直接上代码示例:
import os import inspect def my_function(): # 获取当前函数的代码对象,进而拿到函数名 func_code = inspect.currentframe().f_code func_name = func_code.co_name # 从当前脚本路径中提取文件名(比如my_script.py) module_name = os.path.basename(__file__) # 先打印日志信息 print(f"[日志] 模块: {module_name}, 函数: {func_name} 正在执行") # 再打印你要的内容 print("hallo") if __name__ == "__main__": my_function()
运行这个脚本后,输出会是:
[日志] 模块: my_script.py, 函数: my_function 正在执行 hallo
代码解释:
inspect.currentframe().f_code:inspect模块是Python专门用于检查运行时对象的工具,currentframe()获取当前执行的栈帧,f_code就是当前函数的代码对象,co_name属性就是函数的名称。os.path.basename(__file__):__file__是每个Python脚本都会有的内置属性,存储当前脚本的完整路径,用basename()可以提取出最后的文件名(比如/home/user/my_script.py会变成my_script.py)。
二、简化版:不用inspect模块
如果你不想导入inspect,也可以用Python的内部栈接口sys._getframe()来实现,代码更短:
import sys import os def my_function(): # 直接从栈帧中获取函数名 func_name = sys._getframe().f_code.co_name module_name = os.path.basename(__file__) print(f"[日志] 模块: {module_name}, 函数: {func_name}") print("hallo") if __name__ == "__main__": my_function()
不过要注意,sys._getframe()属于Python的内部接口,官方不保证未来版本会兼容,所以生产环境更推荐用inspect模块。
三、扩展:如果是类中的方法
如果你的代码是在类里,想要获取类名+方法名+模块名,也很简单,结合self.__class__.__name__就能拿到类名:
import os import inspect class MyClass: def my_method(self): class_name = self.__class__.__name__ method_name = inspect.currentframe().f_code.co_name module_name = os.path.basename(__file__) print(f"[日志] 模块: {module_name}, 类: {class_name}, 方法: {method_name}") print("hallo from class method") if __name__ == "__main__": obj = MyClass() obj.my_method()
执行后输出:
[日志] 模块: my_script.py, 类: MyClass, 方法: my_method hallo from class method
这样不管你怎么修改函数、类或者脚本的名称,日志里的信息都会自动更新,不用手动修改字符串,非常方便维护。
内容的提问来源于stack exchange,提问作者user8042669
相关产品推荐
相关产品推荐

