
本文介绍一种清晰、可维护的方案,用于将按规则流式输入的混合类型数据(如颜色枚举与成对数字)解析并映射为结构化数据类实例,通过预处理+策略映射替代状态机式硬编码逻辑。
本文介绍一种清晰、可维护的方案,用于将按规则流式输入的混合类型数据(如颜色枚举与成对数字)解析并映射为结构化数据类实例,通过预处理+策略映射替代状态机式硬编码逻辑。
在处理流式、非结构化的输入数据(例如 ["Red", 3, 1, 4, 5, "Blue", 2, 2, 7, 5, ...])时,直接用状态计数器(positional_counter)和临时变量(digits)逐位拼接字段,不仅逻辑耦合度高、容错性差,还难以扩展和测试。更优的实践是分离关注点:先清洗与分组,再按业务规则构造对象。
✅ 推荐方案:三步法(预处理 → 映射 → 实例化)
1. 定义清晰的数据模型
使用 @dataclass 和继承表达语义差异,避免在单个类中混用互斥字段(如 petrol 和 diesel 同时存在但仅一者有效):
from enum import Enum
from dataclasses import dataclass
from typing import Iterable, Tuple, Type, Union
class Color(Enum):
RED = "Red"
BLUE = "Blue"
YELLOW = "Yellow"
ORANGE = "Orange"
GREEN = "Green"
@dataclass
class Vehicle:
color: Color
engine: int
fuel: int # 统一命名,语义由子类决定
@dataclass
class Diesel(Vehicle):
pass
@dataclass
class Petrol(Vehicle):
pass
2. 预处理:将原始流转换为规范元组
编写健壮的 process_data 函数,自动跳过起始非颜色项,并按「颜色 + 2位引擎 + 2位燃料」模式分组。它具备容错能力,不依赖输入严格对齐:
def process_data(stream: list) -> Iterable[Tuple[Color, int, int]]:
i = 0
while i = len(stream):
break # 数据不完整,丢弃当前组
# 提取两位数:(a,b) → a*10 + b
try:
engine = stream[i+1] * 10 + stream[i+2]
fuel = stream[i+3] * 10 + stream[i+4]
except (TypeError, IndexError):
i += 1
continue
yield (color, engine, fuel)
i += 5 # 移动到下一组起始位置
3. 策略映射:用字典解耦颜色与类型
定义映射表,将颜色直接关联到对应子类,消除冗长 if/elif 判断:
COLOR_TO_CLASS = {
Color.RED: Petrol,
Color.BLUE: Petrol,
Color.YELLOW: Petrol,
Color.ORANGE: Diesel,
Color.GREEN: Diesel,
}
4. 组装:简洁、可读、可测
最终构建逻辑仅需一行核心调用:
raw_data = ["Red", 3, 1, 4, 5, "Blue", 2, 2, 7, 5, "Orange", 5, 2, 6, 8]
vehicles: list[Union[Petrol, Diesel]] = []
for color, engine, fuel in process_data(raw_data):
cls = COLOR_TO_CLASS[color]
vehicles.append(cls(color, engine, fuel))
# 示例输出
for v in vehicles:
print(f"{v.color.name}: engine={v.engine}, fuel={v.fuel} ({type(v).__name__})")
# 输出:
# RED: engine=31, fuel=45 (Petrol)
# BLUE: engine=22, fuel=75 (Petrol)
# ORANGE: engine=52, fuel=68 (Diesel)
⚠️ 注意事项
- 输入鲁棒性:process_data 自动跳过非法前缀,且对不完整组静默忽略,避免崩溃;
- 类型安全:Color 枚举确保颜色值合法;fuel 字段统一命名,语义由实例类型体现;
- 可扩展性:新增颜色只需更新 COLOR_TO_CLASS 字典,无需修改解析或构造逻辑;
- 测试友好:process_data 可独立单元测试;各子类可单独验证行为。
这种设计将“如何解析”与“如何建模”彻底解耦,代码自解释性强,符合 Python 的显式、简洁与组合哲学。










