web-dev-qa-db-ja.com

正しい値が取得されるまでループするTryステートメントを取得する

ユーザーに1から4までの数値を入力させようとしています。数値が正しいかどうかを確認するコードがありますが、数値が正しくなるまでコードを数回ループさせる必要があります。誰でもこれを行う方法を知っていますか?コードは以下のとおりです。

def Release():


    try:
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        a = int(input("Please select the type of release required: "))
        if a == 0:
            files(a)
        Elif a == 1:
            files(a)
        Elif a == 2:
            files(a)
        Elif a == 3:
            files(a)
        else:
            raise 'incorrect'
    except 'incorrect':    
        print 'Try Again'
    except:
        print 'Error'

Release()

入力した例外に関するエラーも表示されます。

kill.py:20: DeprecationWarning: catching of string exceptions is deprecated
  except 'incorrect':
Error

助けてくれてありがとう

15
chrissygormley
def files(a):
    pass

while True:
    try:
        i = int(input('Select: '))
        if i in range(4):
            files(i)
            break
    except:    
        pass

    print '\nIncorrect input, try again'
39
Johannes Charra

現代のPython例外はクラスです。 raise 'incorrect'を使用すると、文字列の例外と呼ばれる非推奨の言語機能を使用できます。 Pythonチュートリアルの Errors and Exceptions セクションは、Pythonでの基本的な例外処理から始めるのに適しています。

一般に、例外はとにかく状況に理想的ではありません。単純なwhileループで十分です。例外は例外的な状況のために予約する必要があり、ユーザーの不適切な入力は例外的ではありません。

Releaseのループベースのバージョンは次のようになります。

def Release():
    a = None
    while a not in (0, 1, 2, 3):
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        try:
            a = int(input("Please select the type of release required: "))
        except ValueError:
            pass  # Could happen in face of bad user input
    files(a)

追伸aは不適切な変数名です。おそらくchosen_optionまたはそのようなものに変更する必要があります。

5
Hank Gay

あなたのアプローチは、かなり単純なものを達成するための非常に長い時間のかかる方法のようです:

def Release() :
    while True :
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        a = int(input("Please select the type of release required: "))
        if 0 <= a < 4 :
            files(a)
            break
        else :
            print('Try Again')
4
sykora

同じ単純なコードブロックで例外のスローとキャッチの両方を行っています-これは、例外処理の目的ではありません。ループから抜け出すか、条件を維持することで、より適切に実行できます。例えば。:

def isNumberCorrect(x):
   return x in range(4)

def Release():
    num = None # incorrect

    while not isNumberCorrect(num):
        print 'Please select one of the following?\nCompletion = 0\nRelease ID = 1\nVersion ID = 2\nBuild ID = 3\n'
        num_str = raw_input("Please select the type of release required: ")

        try:
            num = int(num_str)
        except ValueError:
            num = None

        if not isNumberCorrect(num):
            print 'Incorrect!'

     # work with num here; it's guaranteed to be correct.

if __name__ == '__main__':
  try:
    Release()
  except:
    print 'Error!'

編集: int解析にエラーチェックを追加しました。

3
Max Shawabkeh

例外を使用する代わりに、次のようなことができます:

...
a = raw_input("Please select the type of release required:")
while a not in ['0','1','2','3']: a = raw_input("Try again: ")
files(int(a))
...
2
Anssi
def Release():
    while 1:
        print """Please select one of the following?
                 Completion = 0
                 Release ID = 1
                 Version ID = 2
                 Build ID = 3
                 Exit = 4 """            
        try:
             a = int(raw_input("Please select the type of release required: "))
        except Exception,e:
             print e
        else:
             if a==4: return 0
             files(a)
1
ghostdog74