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

如何在Python类的__init__方法中获取*args对应的原变量名

问题解答

Python的*args本质是接收传入值组成的元组,运行时默认不会携带传入参数的原始变量名信息,无法直接获取,可通过以下两种方案实现需求:

方案1:改用**kwargs传参(推荐)

这是最符合Python语法规范、稳定性最高的实现方式,通过关键字参数传递即可直接获取参数名:

class Parent:
    def __init__(self, **kwargs):
        # 获取所有传入的参数名
        arg_names = list(kwargs.keys())
        # 获取参数名和对应值的映射
        args_map = kwargs
        print(arg_names) # 示例输出:['foo', 'bar']

class Child(Parent):
    def __init__(self, foo, bar):
        # 传入时指定关键字参数
        super().__init__(foo=foo, bar=bar)
  • 优势:无额外依赖、可读性高、适配所有场景,不会受调用写法的影响

方案2:通过inspect模块读取调用栈(仅适合调试用)

如果必须保持*args的传参形式,可以通过解析调用栈的代码上下文获取变量名,属于黑魔法实现,稳定性极低:

import inspect
import re

class Parent:
    def __init__(self, *args):
        # 获取上一层调用栈的帧信息
        call_frame = inspect.currentframe().f_back
        # 读取调用行的原始代码
        call_code = inspect.getframeinfo(call_frame).code_context[0].strip()
        # 正则匹配提取括号内的参数列表
        param_match = re.search(r"super\(\).__init__\((.*?)\)", call_code)
        if param_match:
            arg_names = [p.strip() for p in param_match.group(1).split(",")]
            print(arg_names) # 示例输出:['foo', 'bar']

class Child(Parent):
    def __init__(self, foo, bar):
        super().__init__(foo, bar)
  • 缺陷:
    • 仅当传入参数是直接写的变量名时才有效,如果传入的是字面量、表达式、或者参数换行书写都会匹配失败
    • 部分Python解释器(如PyPy)、打包后的运行环境不支持读取栈帧信息
    • 性能差,仅适合调试场景使用,禁止用于生产环境

注意:如果传入参数不是变量(比如super().__init__(1, "abc")),本身就不存在对应的变量名,任何方法都无法获取

内容的提问来源于stack exchange,提问作者irahorecka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:54:05