2

我正在学习一些 Python 教程,其中不断出现的事情之一是用户输入,我只是想检查我是否正确地验证了它,而不是长时间地进行它。

我已经编写了下面的代码,只需要询问日期月份和年份,但是如果我需要开始询问地址电话号码名称等,这会增长和增长是正常的吗?

def get_input( i ):

    while True:
        # We are checking the day
        if i == 'd':
            try:
                day = int( raw_input( "Please Enter the day: " ) )
                # If the day is not in range reprint
                if day > 0 and day < 32:
                    #Need to account for short months at some point
                    return day
                else:
                    print 'it has to be between 1 and 31'
            except ( ValueError ):
                print "It has to be a number!"
        elif i == 'm':
            # We are checking the month
            month = raw_input( 'Please enter ' +
                              'in words the month: '
                              ).strip().lower()
            if month in months: # use the dict we created
                return month
            else:
                print 'Please check you spelling!'
        elif i == 'y':
            # Now the year
            try:
                year = int( raw_input( "Please Enter the year" +
                                       "pad with 0's if needed: " ) )
                #make we have enough digits and a positive
                if year > 0 and len( year ) == 4:
                    return year
            except ( ValueError, TypeError ):
                    print "It has to be a four digit number!"
4

2 回答 2

5

为什么不让用户一次性输入整个日期,然后尝试验证呢?

from time import strptime

def get_date():
    while True:
        date = raw_input("Please enter a date in DD/MM/YYYY format: ")
        try:
            parsed = strptime(date, "%d/%m/%Y")
        except ValueError as e:
            print "Could not parse date: {0}".format(e)
        else:
            return parsed[:3]

year, month, day = get_date()

这将捕获错误,29/2/2011但接受有效的输入,如29/2/2012.

如果您想接受几种格式,只需列出您要接受的格式字符串,然后在输入中一个接一个地尝试,直到找到一个有效的。但要注意使用超载的问题。

为了验证电话号码,我只需要一个regexp。如果您之前从未使用过正则表达式,这里有一个不错的 python 正则表达式 howto 。地址是非常自由的形式,所以除了限制长度和进行基本的安全检查之外,我认为我不会费心验证它们,特别是如果您接受国际地址。

但一般来说,如果有一个 python 模块,你应该尝试根据输入创建一个实例并捕获错误,就像我在上面的示例中为 time 模块所做的那样。

甚至不要尝试验证名称。为什么不?看看这篇文章。:)

于 2012-09-14T11:17:51.090 回答
0

也许像滤锅这样的框架在这​​里可能会有所帮助:

http://docs.pylonsproject.org/projects/colander/en/latest/?awesome

于 2012-09-14T11:05:22.577 回答