Python非类函数内部隐式获取函数签名与参数值的方法
在Python函数内部自动获取所有参数及对应值(非类函数无需显式指定函数名)
问题背景
需要在Python当前函数内部获取所有参数及其对应值,类方法的实现已正常工作,但非类函数希望无需显式指定函数名即可实现。之前尝试直接传入frame对象给inspect.signature()时触发报错,原因是frame对象并非可调用对象,无法被inspect.signature()识别。
解决方案
对于非类函数,可通过两种方式避免显式写死函数名:
- 利用当前frame的
f_code属性获取函数代码对象,直接传入inspect.signature() - 通过函数名从当前模块的全局命名空间中获取函数对象,再生成签名
修改后的完整代码
import inspect def my_func(a, b, c=None): this_func = inspect.currentframe() func_name = inspect.getframeinfo(this_func).function print(f"Function Name {func_name}") # 方式1:通过frame的f_code获取函数签名 sig = inspect.signature(this_func.f_code) # 方式2:从全局命名空间中获取函数对象(和类方法逻辑更统一) # sig = inspect.signature(globals()[func_name]) local_vars = locals() args = {param: local_vars[param] for param in sig.parameters.keys()} return args class MyClass(object): def __init__(self): pass def my_func_in_class(self, a, b, c=None): this_func = inspect.currentframe() func_name = inspect.getframeinfo(this_func).function print(f"Function Name {func_name}") sig = inspect.signature(getattr(self, func_name)) local_vars = locals() args = {param: local_vars[param] for param in sig.parameters.keys()} return args if __name__ == "__main__": class1 = MyClass() args1 = my_func(1, 2) args2 = class1.my_func_in_class(10, 20, c=30) print(f"args1:") for k, v in args1.items(): print(f"{k}: {v}") print(f"\nargs2:") for k, v in args2.items(): print(f"{k}: {v}")
运行结果
Function Name my_func Function Name my_func_in_class args1: a: 1 b: 2 c: None args2: a: 10 b: 20 c: 30
关键说明
- 方式1中,
this_func.f_code是当前函数的代码对象,inspect.signature()支持直接接收代码对象生成签名 - 方式2中,
globals()[func_name]从当前模块的全局命名空间中取出对应函数名的函数对象,逻辑和类方法的getattr(self, func_name)保持一致,可读性更强
内容的提问来源于stack exchange,提问作者user3014653
相关产品推荐
相关产品推荐

