Python 3.6.9读取YAML配置实现车辆属性筛选及可扩展需求
解决方案
首先修正原代码的安全问题,并实现完整的属性遍历与筛选功能:
1. 安全加载配置并遍历所有属性
原代码使用的yaml.load存在安全风险,建议替换为yaml.safe_load;同时需要进入Cars节点才能获取到具体车型的属性数据:
import yaml # 安全加载YAML配置文件 with open("config.yml", "r") as ymlfile: cfg = yaml.safe_load(ymlfile) # 提取所有车型数据 cars_data = cfg["Cars"] # 遍历每个车型及其所有属性 for car_name, attrs in cars_data.items(): print(f"车型:{car_name}") for attr_name, value in attrs.items(): print(f" {attr_name}:{value}") print("---")
这段代码会自动适配配置文件的扩展——后续新增车型或属性(比如添加Color字段),无需修改代码就能完成遍历。
2. 实现动态筛选功能
将车型数据转换为统一的列表结构,即可用Python内置函数轻松实现各种筛选需求,且适配后续扩展:
import yaml with open("config.yml", "r") as ymlfile: cfg = yaml.safe_load(ymlfile) # 转换为通用列表格式,每个元素包含车型名和所有属性 cars_list = [ {"name": car_name, **attrs} for car_name, attrs in cfg["Cars"].items() ] # 筛选座位数最多的车型 max_seats_car = max(cars_list, key=lambda x: x["Seats"]) print(f"座位数最多:{max_seats_car['name']},座位数:{max_seats_car['Seats']}") # 筛选价格最高的车型 max_price_car = max(cars_list, key=lambda x: x["Price"]) print(f"价格最高:{max_price_car['name']},价格:{max_price_car['Price']}") # 若后续需新增筛选逻辑(比如最新年份),直接复用即可 latest_year_car = max(cars_list, key=lambda x: x["Year"]) print(f"最新年份:{latest_year_car['name']},年份:{latest_year_car['Year']}")
扩展适配说明
- 新增车型:在配置文件中直接添加新的车型节点(如
Toyota: {Price: 380, Seats: 5, Year: 2023}),代码会自动纳入遍历与筛选。 - 新增属性:给车型添加新属性(如
Color: Black),遍历代码会自动输出;若需基于新属性筛选,只需新增对应的max/min逻辑,核心遍历代码无需改动。
内容的提问来源于stack exchange,提问作者TrailSurfer
相关产品推荐
相关产品推荐

