You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

问题原因与修复方案

核心问题

  1. 错误的循环逻辑:用户输入的包裹ID是字符串(比如输入14得到"14"),但for package_id in checkPackage会把字符串拆成单个字符遍历(即"1"和"4"),用这两个单字符去哈希表搜索,自然找不到对应包裹,返回None。
  2. 类型不匹配:哈希表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:04:54