优化获取函数传入参数的代码及相关技术问题咨询
问题解答
1. 用inspect优雅获取参数的方法
如果必须依赖inspect,推荐使用inspect.signature + bind的组合,它能同时处理位置参数、关键字参数和默认参数,比直接操作frame更清晰可控:
sig = inspect.signature(func) bound_args = sig.bind(*args, **kwargs) bound_args.apply_defaults() # 自动填充默认参数值 # 格式化输出参数字典 args_repr = ", ".join([f"{k}={v!r}" for k, v in bound_args.arguments.items()])
如果只是需要快速获取参数字典,也可以用inspect.getcallargs(func, *args, **kwargs),但signature的方式更灵活,支持参数合法性校验等扩展场景。
2. 获取正确函数名称的解决方案
- 装饰器中获取原函数名称:
直接用__name__得到__main__是因为模块顶层的__name__指代模块本身。除了直接调用func.__name__,更规范的做法是用functools.wraps装饰内层函数,它会将原函数的__name__、__doc__等元信息复制到内层函数上,这样inner.__name__就会等于原函数的名称。 - 嵌套函数中获取自身名称:
嵌套函数内部直接写__name__仍会取模块的__name__,要获取当前执行的函数名称,有两种方法:def a(): # 方法1:用inspect获取当前栈帧的函数名 import inspect current_name = inspect.currentframe().f_code.co_name print(current_name) # 输出a # 方法2:直接引用函数自身的__name__属性 print(a.__name__) # 输出a
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

