Python dataclass如何优雅地传入列表中的大量参数?
最优解决方案
直接使用Python原生的序列解包语法即可,不需要修改现有Ship dataclass的任何代码,完全保留其简洁性。
你原来的代码可以直接简化为:
from typing import List from dataclasses import dataclass @dataclass class Ship: width: int height: int # 其余字段定义保持不变 def get_ships(): ... def get_data(ship): ... def main(): ships = [] for ship in get_ships(): ship_data: List[int] = get_data(ship) # 用*解包列表作为位置参数传入dataclass构造方法 ship = Ship(*ship_data) ships.append(ship)
还可以进一步简化为列表推导式,代码更短:
def main(): ships = [Ship(*get_data(ship)) for ship in get_ships()]
注意事项
- 必须保证
ship_data的元素顺序和Ship类定义的字段顺序完全一致,避免出现字段赋值错位的隐性问题 - 必须保证
ship_data的长度和Ship类的字段数量完全匹配,否则会抛出参数数量不匹配的TypeError
可选兜底方案
如果无法保证ship_data的元素顺序和字段顺序一致,可以加一层轻量的字典转换,用关键字参数解包传入,避免顺序错位问题:
# 按字段定义顺序填写所有字段名 SHIP_FIELDS = ["width", "height", "其余你定义的字段名"] def main(): ships = [] for ship in get_ships(): ship_data: List[int] = get_data(ship) ship_param_dict = dict(zip(SHIP_FIELDS, ship_data)) ship = Ship(**ship_param_dict) ships.append(ship)
内容的提问来源于stack exchange,提问作者jl8n
相关产品推荐
相关产品推荐

