Python UI问题:无法通过输入变量访问Hashtable及包裹对象
问题:Python UI中选项3查询指定包裹状态报错
我开发的Python UI里,除选项3外其余功能均正常。选项3用于根据用户输入的时间打印指定包裹的状态,但运行时出现错误;功能类似的选项2(根据输入时间打印所有包裹状态)可正常工作。
选项2正常代码
# Option 2 elif option == "2": # checkTime = input function and use timedelta for correct format checkTime = input('Please enter a time in the form "00:00:00"') hour, minute, second = checkTime.split(":") rtime = datetime.timedelta(hours=int(hour), minutes=int(minute), seconds=int(second)) # For all packages print status at certain time for i in range(40): pack = myHash.search(i + 1) print(pack) # At Hub if rtime < pack.timeLeftHub0: print('At Hub') elif rtime == pack.time_delivered: print('Delivered on Truck ' + str(pack.truck)) elif rtime > pack.time_delivered: print('Delivered on Truck ' + str(pack.truck)) else: print('En Route on Truck ' + str(pack.truck))
选项3报错代码
# Option 3 elif option == "3": checkPackage = input('Please enter a package using its package ID') checkTime = input('Please enter a time in the form "00:00:00"') hour, minute, second = checkTime.split(":") rtime = datetime.timedelta(hours=int(hour), minutes=int(minute), seconds=int(second)) for package_id in checkPackage: pack = myHash.search(package_id) if rtime < pack.timeLeftHub0: pack.status = 'At Hub' print(str(pack.package_id) + ' package status at ' + str(rtime) + ' = ' + str(pack.status)) elif rtime == pack.time_delivered: pack.status = 'Delivered' print(str(pack.package_id) + ' package status at ' + str(rtime) + ' = ' + str(pack.status)) elif rtime > pack.time_delivered: pack.status = 'Delivered' print(str(pack.package_id) + ' package status at ' + str(rtime) + ' = ' + str(pack.status)) else: pack.status = 'En Route' print(str(pack.package_id) + ' package status at ' + str(rtime) + ' = ' + str(pack.status))
报错信息
Choose an option (1,2,3, or 4): 3 Please enter a package using its package ID14 Please enter a time in the form "00:00:00"10:00:00 Traceback (most recent call last): File "C:\Users\alecc\PycharmProjects\pythonProject\Main.py", line 431, in <module> if rtime < pack.timeLeftHub0: ^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'timeLeftHub0'
问题原因与修复方案
核心问题
- 错误的循环逻辑:用户输入的包裹ID是字符串(比如输入
14得到"14"),但for package_id in checkPackage会把字符串拆成单个字符遍历(即"1"和"4"),用这两个单字符去哈希表搜索,自然找不到对应包裹,返回None。 - 类型不匹配:哈希表
myHash.search方法需要的是整数类型的包裹ID(参考选项2中用i+1整数作为参数),但用户输入的是字符串,未做类型转换。
修正后的选项3代码
# Option 3 elif option == "3": checkPackage = input('Please enter a package using its package ID') # 处理输入:转为整数,加入异常判断防止非数字输入 try: package_id = int(checkPackage) except ValueError: print("无效的包裹ID,请输入数字。") continue # 回到选项选择界面 checkTime = input('Please enter a time in the form "00:00:00"') hour, minute, second = checkTime.split(":") rtime = datetime.timedelta(hours=int(hour), minutes=int(minute), seconds=int(second)) # 搜索包裹,判断是否存在 pack = myHash.search(package_id) if not pack: print(f"未找到ID为{package_id}的包裹。") continue # 简化状态判断逻辑 if rtime < pack.timeLeftHub0: status = 'At Hub' elif rtime >= pack.time_delivered: status = 'Delivered' else: status = 'En Route' # 格式化输出 print(f"{pack.package_id} package status at {rtime} = {status}")
修复说明
- 移除了错误的字符遍历循环,直接处理单个包裹ID输入
- 将输入的字符串包裹ID转为整数,匹配哈希表的键类型
- 增加异常处理,拦截非数字输入,避免程序崩溃
- 增加包裹不存在的判断,给出友好提示
- 简化状态判断逻辑,合并重复条件,提升代码可读性
内容的提问来源于stack exchange,提问作者user24021390
相关产品推荐
相关产品推荐

