首页 > 解决方案 > 创建了一个 python 程序来估计旅行时间并出现错误

问题描述

我已经让一切正常,但由于某种原因,当我输入 500 英里和 80 英里/小时时,它说输入无效。

这是我的代码。

import time
import datetime

from datetime import datetime
from datetime import timedelta

ch='y'
print("Arrival Time Estimator\n\n")
while ch!='n':
    try:
        est_date_dept = input('Estimated date of departure (YYYY-MM-DD):')
        est_time_dept = input('Estimated time of departure (HH:MM AM/PM):')
        dist = int(input('Enter Miles:'))
        speed = int(input('Enter miles per hour:'))
        travel_time = int(dist)/speed
        t=timedelta(hours=travel_time)
        t=str(t)
        t=t.split(':')
        if t[2] > '00':
          t[1]=int(t[1])+1
          travel_time+=0.01
          time = datetime.strptime(est_time_dept, "%I:%M %p")
          est_time_dept = datetime.strftime(time, "%H:%M")
          est_date_dept = est_date_dept+" "+est_time_dept
          arr_date_time = datetime.strptime(est_date_dept, "%Y-%m-%d %H:%M")
          arr_date_time += timedelta(hours=travel_time)
          est_arr = arr_date_time.strftime("%Y-%m-%d %I:%M %p")
          est_arr=str(est_arr)
        est_arr=est_arr.split()
        print ('\n\nEstimated travel time')
        print ('Hours:',t[0],'\nMinutes:', t[1])
        print ('Estimated date of arrival:',est_arr[0])
        print ('Estimated time of arrival:', est_arr[1], est_arr[2])
        ch = input('\nContinue? (y/n):')
    except:
        print ("Invalid input")
        ch = input("\nContinue? (y/n):")

我得到的输出是 输出

标签: python

解决方案


如果您想知道出了什么问题,请不要使用except:会丢弃该信息的裸机。

删除try:/ except:(至少暂时,用于调试),或将其更改为except Exception as e:then print(f"Invalid input: {e!r}"),或包含错误消息的内容。


对于您的输入,如果日期或时间无效,则实际异常如下所示:

ValueError("time data '19:23 AM' does not match format '%I:%M %p'")

在这种情况下,错误消息是正确的——输入无效。这并不是那么有用,因为你没有让用户知道他们的四个输入中的哪一个是无效的,或者为什么,但它是正确的。

但如果它们都是有效的,错误是这样的:

NameError("name 'est_arr' is not defined")

在这种情况下,调用输入无效是错误的。


你为什么会得到这个?好吧,让我们解决它:

travel_time = int(dist)/speed # int(500)/80 = 6.25
t=timedelta(hours=travel_time) # timedelta with 6:15:00
t=str(t) # the string '6:15:00'
t=t.split(':') # the list ['6', '15', '00']
if t[2] > '00': # not true, because '00' is not > '00'
# if body skipped
est_arr=est_arr.split() # oops, NameError

est_arr如果时间是精确的分钟数(没有剩余秒数),您永远不会分配任何东西。

因此,当您尝试使用 时est_arr,您会收到一条NameError告诉您从未为该名称分配任何内容的信息。

你怎么能解决这个问题?好吧,我不知道你想在那里做什么。你为什么把它if放在首位?当它不是真的时,你想要发生什么?我想不出任何好的理由,但大概你心里有一个。


推荐阅读