如何在Python类__init__中按类型分组*args参数
实现按类型分离可变参数的类初始化方法
Python本身不支持在函数定义里同时声明两个*开头的可变参数(比如你想要的*legs, *vals),但可以通过统一接收*args后手动按类型分离的方式实现需求,以下是完整实现:
class Example: def __init__(self, *args, named_input: float, named_input_2: str): self.legs = [] self.vals = [] # 遍历所有位置可变参数,按类型分类 for item in args: if isinstance(item, str): self.legs.append(item) elif isinstance(item, (int, float)): self.vals.append(item) else: raise TypeError(f"不支持的参数类型: {type(item)},仅接受字符串、整数或浮点数") # 强制验证至少传入一个leg if not self.legs: raise ValueError("必须至少传入一个leg参数(字符串类型)")
调用示例
按照你期望的方式调用,结果完全符合需求:
# 仅传入legs的情况 a = Example('1y', '5y', named_input=100, named_input_2='setting_1') print(a.legs) # 输出: ['1y', '5y'] print(a.vals) # 输出: [] # 传入legs和单个val的情况 b = Example('1y', '5y', 15, named_input=100, named_input_2='setting_1') print(b.legs) # 输出: ['1y', '5y'] print(b.vals) # 输出: [15] # 传入单个leg和多个vals的情况 c = Example('1y', 0, 15, 30, named_input=100, named_input_2='setting_1') print(c.legs) # 输出: ['1y'] print(c.vals) # 输出: [0, 15, 30]
关键逻辑说明
- 参数接收:用
*args接收所有位置可变参数,规避Python语法不支持双可变参数的限制。 - 类型分离:遍历
args,根据元素类型分别存入legs(字符串)和vals(整数/浮点数)列表,遇到非预期类型直接抛出错误提示。 - 合法性验证:检查
legs列表是否为空,确保满足“至少传入1个leg”的硬性要求。
内容的提问来源于stack exchange,提问作者keynesiancross
相关产品推荐
相关产品推荐

