Python 3.2 UnboundLocalError в конвертере даты в день недели - PullRequest
0 голосов
/ 11 декабря 2011

Кодер Nooby здесь! Мое задание состоит в том, чтобы кодировать что-то, что печатает день недели любой данной даты. Мой код работает нормально, но когда я запускаю что-то, что не в правильном формате (то есть "// 2011" или "12 / a / 2011"), это выдаст мне эту ошибку:

line 55, in main if is_date_valid(month, day, year) == False:
UnboundLocalError: local variable 'month' referenced before assignment

Хотя все работает нормально, если я попробую "13/2/2011". Пожалуйста, помогите мне найти мою проблему, так как мой учитель не знал решения, когда я спросил его об этом! Вот весь код, если необходимо (игнорируйте мои комментарии: p) Большое спасибо: D

import sys
DAYS_IN_MONTH = ('31', '28', '31', '30', '31', '30', '31', '31', '30', '31', '30', '31')
MONTHS_IN_WORDS = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
DAYS_OF_WEEK = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')

def get_date():
    str_date = input('Enter date: ')#.strip() = method :D
    parts = str_date.split('/')#pasts = ['12', '2', '2011']
    length = len(parts)
    if length != 3:
        raise ValueError('Invalid format for date.')
    for i in range(length):
        parts[i] = parts[i].strip()
        if len(parts[i]) == 0 or not(parts[i].isdigit()):
            raise ValueError('Invalid format for date.')
    return(int(parts[0]), int(parts[1]), int(parts[2]))

def is_date_valid(month, day, year): #is_date_valid = name of function
    if month < 1 or month > 12 or day < 1 or year < 0:
        return False
    if month != 2:
        return int(day) <= int(DAYS_IN_MONTH[month-1])
    additional = 0
    if year % 400 == 0 or year % 4 == 0 and year % 100 != 0:
        additional = 1
    return int(day) <= int(DAYS_IN_MONTH[1]) + int(additional)

#month, day, year = arguments of function

def date_as_string(month, day, year):
    if month > 0 and month < 13:
        return MONTHS_IN_WORDS[month-1] + ' ' + str(day) + ', ' + str(year)


def day_of_week(month, day, year):
    if month < 3:
        month += 12
        year -= 1
    m = month
    q = day
    J = year // 100
    K = year % 100
    h = (q + 26*(m+1)//10 + K + K//4 + J//4 - 2*J) % 7
    dayweek = DAYS_OF_WEEK[h-2]
    return dayweek

def main():
    print('This program calculates the day of the week for any date.')
    try:
        (month, day, year) = get_date()
    except ValueError as error:
        print("ERROR:", error)
        sys.exit(1)
    if is_date_valid(month, day, year) == False:
        print(str(month) + '/' + str(day) + '/' + str(year) + ' is an invalid date.')
        print()

    else: 
        print(date_as_string(month, day, year) + ' is a ' + day_of_week(month, day, year) + '.')
        print()



#any function call that can raise an error must be put inside a try block
if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 11 декабря 2011

Во-первых, вы вводите дату без месяца, ваша программа сообщит вам, что у вас нет месяца.Кажется, это не является большой проблемой?

Во-вторых, и оба ваших примера на самом деле приведут к «ОШИБКЕ: Неверный формат даты.», А не к исключению, на которое вы претендуете.Ваш последний пример.13/2/2011, даст "13/2/2011 является недействительной датой.", Но если вы измените ее на действительную дату, например, "12/2/2011", это даст "13 февраля 2011 года является воскресным. "

Следовательно, ваша программа работает отлично.

...