2

私はいくつかの Python チュートリアルを進めていますが、ユーザー入力が引き続き発生することの 1 つであり、それを正しく検証していることを確認したかっただけで、長い道のりではありません。

私は以下のコードを書きましたが、月と年を尋ねるだけで済みますが、住所、電話番号、名前などを尋ね始める必要がある場合、これはどんどん大きくなっていきますが、それは正常ですか?

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

複数のフォーマットを受け入れたい場合は、受け入れたいフォーマット文字列のリストを作成し、機能するものが見つかるまで、入力で次々に試してみてください。ただし、使用量のオーバーロードの問題に注意してください。

電話番号を検証するために、正規表現を使用します。これまでに正規表現を使用したことがない場合は、ここに優れたpythonregexphowtoがあります。住所は非常に自由形式なので、特に国際住所を受け入れる場合は、長さを制限して基本的なセキュリティチェックを行う以外に、わざわざ検証する必要はないと思います。

ただし、一般に、Pythonモジュールがある場合は、上記の例の時間モジュールの場合と同様に、入力に基づいてインスタンスを作成し、エラーをキャッチする必要があります。

名前を検証しようとさえしないでください。なぜだめですか?この記事を見てください。:)

于 2012-09-14T11:17:51.090 に答える
0

おそらく、colander のようなフレームワークがここで役立つかもしれません:

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

于 2012-09-14T11:05:22.577 に答える