Получение бесконечного цикла для одной функции, но не для аналогичной функции, пытаясь проверить правильность ввода даты - PullRequest
0 голосов
/ 15 июня 2019

Попытка создать проверку ввода для даты в формате ГГГГ-ММ-ДД. У меня есть два способа сделать это.

Первый метод, кажется, работает и возвращается к циклу, чтобы получить ввод каждый раз, когда возникает ошибка.

Функция во втором методе вызывает бесконечный цикл, но почти идентичная функция в первом методе - нет.

Если я ввожу правильно отформатированную дату во втором методе, она печатается, как ожидается, но для любого другого ввода она создает бесконечный цикл.

Я не уверен, где это ломается?

Я посмотрел ряд результатов Google, и существует множество проверок дат, но я не нашел такой, которая бы явно указывала, как вернуться назад и повторить попытку.

Я не был уверен, что еще можно попробовать, не переписав по существу один метод.


import datetime as dt

#METHOD 1 - This is the first method for validating date input, which takes in individual blocks and validates each one individually. 

def get_date(year_prompt, month_prompt, day_prompt):

    #Year Input
    while True:
        try:
            year = int(input(year_prompt))
        except ValueError:
            print("Sorry, I didn't understand that.\n")
            continue
        if year in range(2000,3000,1):
            break
        else:
            print("Sorry, your response must be in YYYY format and later than the year 2000.\n")
            continue

    #Month Input
    while True:
        try:
            month = int(input(month_prompt))
        except ValueError:
            print("Sorry, I didn't understand that.\n")
            continue
        if month in range(1,13,1):
            break
        else:
            print("Sorry, needs to be MM and between 1-12\n")
            continue

    #Day Input
    while True:
        try:
            day = int(input(day_prompt))
        except ValueError:
            print("Sorry, I didn't understand that.\n")
            continue
        if day in range(1,32,1):
            break
        else:
            print("Sorry, needs to be DD and between 1-31\n")
            continue

    #Takes the three inputs and puts them together into a date
    date = dt.datetime(year, month, day)

    #Returns the date      
    return date

#Runs the first method of getting and validating a date.
date = get_date("\nYYYY: ", "\nMM: ", "\nDD: ")

#Prints the validated date.
print("\nThe date you entered is: ", date, "\n")


#METHOD 2 - This is the second method for validating date, which takes in the whole date in one input, and attempts to validate it against the YYYY-MM-DD format.

def input_validation(date):
    while True:
        try:
            dt.datetime.strptime(date, '%Y-%m-%d')
            break
        except ValueError:
            print("\nSorry, this does not appear to be a valid date in format YYYY-MM-DD")
            continue        
    return date

#Prints the validated date. 
print("\nThe date you entered is: ", input_validation(input("Enter a date in format YYYY-MM-DD: ")), "\n")

Мой ожидаемый результат для второго метода: либо дата в формате ГГГГ-ММ-ДД, либо сообщение об ошибке, которое затем снова запрашивает ввод.

1 Ответ

0 голосов
/ 15 июня 2019

Вы можете избавиться от бесконечного цикла while True и вернуть True или False на основе даты в правильном формате

def input_validation(date):

    #Flag to check date format
    flag = False
    try:
        #If date is of correct format, set flag to True
        dt.datetime.strptime(date, '%Y-%m-%d')
        flag = True
    except ValueError:
        print("\nSorry, this does not appear to be a valid date in format YYYY-MM-DD")
    #Return flag
    return flag

print(input_validation('2019-01-31'))
print(input_validation('2019-001-31'))
print(input_validation('2019-01-311'))

Вывод будет

True

Sorry, this does not appear to be a valid date in format YYYY-MM-DD
False

Sorry, this does not appear to be a valid date in format YYYY-MM-DD
False

Вы можете обернуть эту функцию вокруг while True, чтобы продолжить принимать данные от пользователя

while True:
    date_str = input('Enter Date')
    if input_validation(date_str):
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...