You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化获取函数传入参数的代码及相关技术问题咨询

问题解答

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:40:12