Python中是否存在获取当前函数名的变量?求助替代方法
获取当前函数名称的可行方案
你遇到的问题是__name__是模块级变量,它返回的是当前模块的名称(比如脚本直接运行时会返回__main__),而非当前函数的名称。以下是几种无需手动输入、能动态获取当前函数名的方法:
方法1:利用sys模块的栈帧信息
导入sys模块后,通过栈帧对象直接获取当前函数名:
import sys import json def connection_sniffer(): if gvl.global_program_logging_state: # 获取当前函数名称 func_name = sys._getframe().f_code.co_name pythonValues = dict(locals()) jsonValues = json.dumps(pythonValues) write_program_log(func_name, jsonValues)
sys._getframe(0)默认指向当前栈帧,f_code.co_name就是该栈帧对应的函数名称。
方法2:使用inspect模块(更推荐,可读性更强)
inspect是Python标准库中专门用于对象检查的工具,用它获取函数名更规范:
import inspect import json def connection_sniffer(): if gvl.global_program_logging_state: # 方式1:通过当前栈帧获取 func_name = inspect.currentframe().f_code.co_name # 方式2:通过栈帧列表获取(更直观) # func_name = inspect.stack()[0][3] pythonValues = dict(locals()) jsonValues = json.dumps(pythonValues) write_program_log(func_name, jsonValues)
方法3:直接引用函数自身的__name__属性(场景受限)
如果不需要通用适配,也可以直接引用函数对象的__name__属性,但这种方式需要和函数名硬绑定,函数改名时需同步修改:
import json def connection_sniffer(): if gvl.global_program_logging_state: func_name = connection_sniffer.__name__ pythonValues = dict(locals()) jsonValues = json.dumps(pythonValues) write_program_log(func_name, jsonValues)
额外优化:只记录函数入参
你当前用locals()会获取函数内所有局部变量(包括后续定义的变量),如果只想记录函数的输入参数,可以结合inspect.signature过滤:
import inspect import json def connection_sniffer(param1, param2): if gvl.global_program_logging_state: func_name = inspect.currentframe().f_code.co_name # 提取函数签名中的入参,只保留入参对应的变量 sig = inspect.signature(connection_sniffer) params = {k: locals()[k] for k in sig.parameters} jsonValues = json.dumps(params) write_program_log(func_name, jsonValues)
内容的提问来源于stack exchange,提问作者user21051037
相关产品推荐
相关产品推荐

