已在if/elif中给vehicle赋值仍报局部变量未定义错误是什么原因
报错原因分析
你遇到的报错核心是vehicle变量并非在所有代码执行路径下都会被赋值,只要触发以下任意一种场景就会出现该错误:
- 当循环读取到
#CARS#/#VANS#/#TRUCKS#这类头标记行时,代码只会给file_header_found赋值,不会进入else分支,也就不会给vehicle赋值,但后续直接调用self.vehicles.add_vehicle(vehicle),此时vehicle未定义直接触发报错,这是最常见的触发原因。 - 如果文件在还没读到任何合法头标记的情况下,先出现了车辆数据行,此时
file_header_found的初始值是第一行分割后的列表,和三个头字符串都匹配不上,三个if/elif分支都不会执行,vehicle不会被赋值。 - 如果文件中出现既不是头标记、也不属于三类车辆的异常数据行,也会导致
vehicle漏赋值。
修复方案
你可以调整代码逻辑,头标记行不需要加入车辆列表,匹配到头标记后直接跳过后续的添加逻辑,同时增加兜底判断避免漏匹配,参考修复后的代码:
def populate_vehicles(self, vehicle_file): empty_str = '' vehicle_str = vehicle_file.readline() # 初始值设为None,避免误把第一行数据当默认头标记 file_header_found = None vehicle_str = vehicle_file.readline() while vehicle_str != empty_str: vehicle_info = vehicle_str.rstrip().split(',') if vehicle_str in ('#CARS#', '#VANS#', '#TRUCKS#'): file_header_found = vehicle_str # 头标记行不需要加入车辆列表,直接读取下一行 vehicle_str = vehicle_file.readline() continue # 未读到合法头标记时直接跳过当前行 if not file_header_found: vehicle_str = vehicle_file.readline() continue vehicle = None if file_header_found == '#CARS#': vehicle = Car(*vehicle_info) elif file_header_found == '#VANS#': vehicle = Van(*vehicle_info) elif file_header_found == '#TRUCKS#': vehicle = Truck(*vehicle_info) # 只有成功生成vehicle对象才加入列表 if vehicle is not None: self.vehicles.add_vehicle(vehicle) vehicle_str = vehicle_file.readline()
内容的提问来源于stack exchange,提问作者gaffer85
相关产品推荐
相关产品推荐

