如何提示输入直到日期格式和时间格式正确?
How to prompt input until date format and time format is correct?
我正在做一个活动策划,我想提示开始日期和结束日期。验证一直有效到开始日期和开始时间,但在结束日期和时间期间出现问题。
当结束日期格式不正确时,不再提示结束日期,而是再次提示开始时间,结束时间也一样。
import datetime as dt
date_format = "%d-%m-%Y"
time_format = "%H:%M"
start_date = input("Please enter start date: ")
while True:
try:
dt.datetime.strptime(start_date, date_format)
start_time = input("Please enter start time: ")
try:
dt.datetime.strptime(start_time, time_format)
end_date = input("Please enter end date: ")
try:
dt.datetime.strptime(end_date, date_format)
end_time = input("Please enter end time: ")
try:
dt.datetime.strptime(end_time, time_format)
print(start_date,start_time)
print(end_date,end_time)
except:
print("This is the incorrect time string format. It should be HH:MM")
except:
print("This is the incorrect date string format. It should be DD-MM-YYYY")
except:
print("This is the incorrect time string format. It should be HH:MM")
except:
print("This is the incorrect time string format. It should be DD-MM-YYYY")
start_date = input("Please enter start date: ")
对每个提示使用 while-loop
。
import datetime as dt
date_format = "%d-%m-%Y"
time_format = "%H:%M"
while True:
start_date = input("Please enter start date: ")
try:
dt.datetime.strptime(start_date, date_format)
break
except:
continue
while True:
start_time = input("Please enter start time: ")
try:
dt.datetime.strptime(start_time, time_format)
break
except:
continue
while True:
end_date = input("Please enter end date: ")
try:
dt.datetime.strptime(end_date, date_format)
break
except:
continue
while True:
end_time = input("Please enter end time: ")
try:
dt.datetime.strptime(end_time, time_format)
break
except:
continue
print(start_date, start_time)
print(end_date, end_time)
如果在执行过程中发生错误,一切都会在 while true 之后重新开始,即在 start_time
考虑使用简单的状态机:
def prompt_start_time():
#get input, do something and validate format
if input_validated:
next_state = "prompt_date"
return start_time, next_state
else:
return None, "prompt_start_time"
def prompt_date():
#do something and return prompt date
if input_validated:
next_state = "end_date"
else:
next_state = "prompt_date"
return start_date, next_state
def end_date():
#...
state_machine = {"prompt_start_time": prompt__start_time, "prompt_date":prompt_date, "end_date": end_date}
while True:
value, state = state_machine[current_state]()
current_state = state
这是一种简洁的 Pythonic 方法:
import datetime as dt
date_format = "%d-%m-%Y"
time_format = "%H:%M"
def get_date(date_format, input_message):
date = None
while True:
try:
date = input(input_message)
dt.datetime.strptime(date, date_format)
except:
print("This is the incorrect date string format. It should be DD-MM-YYYY")
# Error! Return to the start of the loop
continue
else:
# Success! Exit loop
break
return date
def get_time(time_format, input_message):
time = None
while True:
try:
time = input(input_message)
dt.datetime.strptime(time, time_format)
except:
print("This is the incorrect time string format. It should be HH:MM")
# Error! Return to the start of the loop
continue
else:
# Success! Exit loop
break
return time
start_date = get_date(date_format, "Please enter start date: ")
start_time = get_time(time_format, "Please enter start time: ")
end_date = get_date(date_format, "Please enter end date: ")
end_time = get_time(time_format, "Please enter end time: ")
- 我们创建了 2 个函数:一个用于日期输入,另一个用于时间输入
- 然后我们通过更改作为参数传递的输入消息来调用这些函数
输入验证逻辑包含在2个函数中,这样代码维护起来会更容易。
关于如何输入验证的说明已完成:
这里我们使用 try/except/else:
如果 try
子句引发异常,它将执行 except
中的内容
如果try
子句没有抛出异常,就会执行else
中的代码
if in except: we are here because input is wrong, so we print a message, and we use continue
order to go directly at the start of the loop, in命令再次执行try
中的代码。
如果我们在else
:输入OK,所以我们使用break
以便离开while循环。
我正在做一个活动策划,我想提示开始日期和结束日期。验证一直有效到开始日期和开始时间,但在结束日期和时间期间出现问题。 当结束日期格式不正确时,不再提示结束日期,而是再次提示开始时间,结束时间也一样。
import datetime as dt
date_format = "%d-%m-%Y"
time_format = "%H:%M"
start_date = input("Please enter start date: ")
while True:
try:
dt.datetime.strptime(start_date, date_format)
start_time = input("Please enter start time: ")
try:
dt.datetime.strptime(start_time, time_format)
end_date = input("Please enter end date: ")
try:
dt.datetime.strptime(end_date, date_format)
end_time = input("Please enter end time: ")
try:
dt.datetime.strptime(end_time, time_format)
print(start_date,start_time)
print(end_date,end_time)
except:
print("This is the incorrect time string format. It should be HH:MM")
except:
print("This is the incorrect date string format. It should be DD-MM-YYYY")
except:
print("This is the incorrect time string format. It should be HH:MM")
except:
print("This is the incorrect time string format. It should be DD-MM-YYYY")
start_date = input("Please enter start date: ")
对每个提示使用 while-loop
。
import datetime as dt
date_format = "%d-%m-%Y"
time_format = "%H:%M"
while True:
start_date = input("Please enter start date: ")
try:
dt.datetime.strptime(start_date, date_format)
break
except:
continue
while True:
start_time = input("Please enter start time: ")
try:
dt.datetime.strptime(start_time, time_format)
break
except:
continue
while True:
end_date = input("Please enter end date: ")
try:
dt.datetime.strptime(end_date, date_format)
break
except:
continue
while True:
end_time = input("Please enter end time: ")
try:
dt.datetime.strptime(end_time, time_format)
break
except:
continue
print(start_date, start_time)
print(end_date, end_time)
如果在执行过程中发生错误,一切都会在 while true 之后重新开始,即在 start_time
考虑使用简单的状态机:
def prompt_start_time():
#get input, do something and validate format
if input_validated:
next_state = "prompt_date"
return start_time, next_state
else:
return None, "prompt_start_time"
def prompt_date():
#do something and return prompt date
if input_validated:
next_state = "end_date"
else:
next_state = "prompt_date"
return start_date, next_state
def end_date():
#...
state_machine = {"prompt_start_time": prompt__start_time, "prompt_date":prompt_date, "end_date": end_date}
while True:
value, state = state_machine[current_state]()
current_state = state
这是一种简洁的 Pythonic 方法:
import datetime as dt
date_format = "%d-%m-%Y"
time_format = "%H:%M"
def get_date(date_format, input_message):
date = None
while True:
try:
date = input(input_message)
dt.datetime.strptime(date, date_format)
except:
print("This is the incorrect date string format. It should be DD-MM-YYYY")
# Error! Return to the start of the loop
continue
else:
# Success! Exit loop
break
return date
def get_time(time_format, input_message):
time = None
while True:
try:
time = input(input_message)
dt.datetime.strptime(time, time_format)
except:
print("This is the incorrect time string format. It should be HH:MM")
# Error! Return to the start of the loop
continue
else:
# Success! Exit loop
break
return time
start_date = get_date(date_format, "Please enter start date: ")
start_time = get_time(time_format, "Please enter start time: ")
end_date = get_date(date_format, "Please enter end date: ")
end_time = get_time(time_format, "Please enter end time: ")
- 我们创建了 2 个函数:一个用于日期输入,另一个用于时间输入
- 然后我们通过更改作为参数传递的输入消息来调用这些函数
输入验证逻辑包含在2个函数中,这样代码维护起来会更容易。
关于如何输入验证的说明已完成: 这里我们使用 try/except/else:
如果
中的内容try
子句引发异常,它将执行except
如果
中的代码try
子句没有抛出异常,就会执行else
if in except: we are here because input is wrong, so we print a message, and we use
continue
order to go directly at the start of the loop, in命令再次执行try
中的代码。如果我们在
else
:输入OK,所以我们使用break
以便离开while循环。