On Wed, Dec 31, 2008 at 8:33 AM, David <da...@abbottdavid.com> wrote:
> On Mon, 29 Dec 2008 16:57:44 +0100, spir wrote: >> >> > On Mon, 29 Dec 2008 09:10:45 -0000 >>> > "Alan Gauld" <alan.ga...@btinternet.com> wrote: >>> > > >>> >>>> >> "bob gailer" <bgai...@gmail.com> wrote >>>> >> >>>> >>>>> >> > Also IMHO it is bad design to put a lot of code inside a try >>>>> block. >>>>> >> > In this case the user might make a mistake on day and then is >>>>> forced >>>>> >> > to reenter the year and month! >>>>> >>>> >> >> Obviously there is no absolute rule here but I disagree. One of >>>> the >>>> >> biggest advantages of try/except error handling is that it keeps the >>>> >> mess of handling errors out of the main logic of the code. This has >>>> two >>>> >> effects: >>>> >> 1) Code that is much easier to read >>>> >> 2) a lot less error handling code >>>> >>> Also, I'd rather ask for the dates in one raw_input, cuts much of the >> mess for the user (although it's a bit of extra codes) >> > Thank you all for the tips. Next to do is to get the dates in one raw_input > with the correct format and to check for a valid year, month, and day. Here > is what I have now; > #!/usr/bin/python > import time > > curr_date = time.strftime("%Y %m %d", time.gmtime()) > print "Please enter the date format as: ", curr_date > > while True: > yr = raw_input("\nWhat year were you born? ") > mn = raw_input("What month were you born? ") > dy = raw_input("What day were you born? ") > try: > ynum = int(time.strftime("%Y", time.gmtime())) - int(yr) > mnum = int(time.strftime("%m", time.gmtime())) > dnum = int(time.strftime("%d", time.gmtime())) > except ValueError: > print "Oops, You must enter a number!" > else: > mn = int(mn) > dy = int(dy) > > if mn <= mnum: > print "You are", ynum, "years old." > break > elif mn == mnum and dy < dnum: > print "You are", ynum, "years old." > break > else: > ret = int(ynum) - 1 > print "You are", ret, "years old." > break > > > -- > Powered by Gentoo GNU/LINUX > http://www.linuxcrazy.com > pgp.mit.edu > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > Hi David, If the user enters incorrect data for the month or day, a ValueError will still be raised on the conversion to integer. I suggest that you wrap your request for user information in a function that does the checking for you. You can re-use this function for each piece of integer information you require from the user. example: import time class BadUserError(Exception): pass def get_integer(retrieve, question, attempts=3): """ A small function to attempt to retrieve information from a user, given a prompt question. retrive - any function that will accept a string as an argument and return a string or otherwise response from the user. question - a string type question that you would like to ask the user to respond to. attempts[optional] - how many times the user can incorrectly enter data before the BadUserError is raised. """ while attempts > 0: num = retrieve(question) try: # try casting the user input as an integer. return int(num) except ValueError: print "Oops, You must enter a number!" attempts -= 1 raise BadUserError("Too many incorrect tries!") curr_date = time.strftime("%Y %m %d", time.gmtime()) print "Please enter the date format as: ", curr_date yr = get_integer(raw_input, "\nWhat year were you born? ") mn = get_integer(raw_input, "What month were you born? ") dy = get_integer(raw_input, "What day were you born? ") today = time.gmtime() ynum = today.tm_year - yr mnum = today.tm_mon dnum = today.tm_mday if mn <= mnum: print "You are", ynum, "years old." elif mn == mnum and dy < dnum: print "You are", ynum, "years old." else: ret = int(ynum) - 1 print "You are", ret, "years old."
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor