如何在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
相关产品推荐
相关产品推荐

