問題は、あなたのtry
とexcept
ではなく、あなたがすべてでtry
とexcept
を使用しているという事実ではありません。 try
ブロックのコードではエラーが発生しないため、except
がトリガーされることはありません。 if
ステートメントを使用します。
また
、あなたの状態choice == "v"
のためだけチェックし、それは(choice == "v") and "g"
として評価され、"g"
は、長さ0の文字列ではありませんので、必ず(ブールコンテキストで真とする)「truthy」である。されているため、何でもand
真は変わらないので、最初のテストだけが意味を持ちます。このテストを行う最善の方法はin
です。
最後に、while
ループを使用して、ユーザーが有効なエントリを入力するまでプロンプトを繰り返すことができます。
prompt = "Enter v for validate, or g for generate >"
choice = input(prompt).strip().lower()[:1] # take at most 1 character
while choice not in ("v", "g"):
print("Not a valid choice! Try again.")
choice = input(prompt).strip().lower()[:1]
は(おそらくスクリプトの残りの部分になりますように)、それはだあなたは再びそれを使用するようにコードを一般化する方法を考える場合:すべて一緒にそれを置く
は
、あなたはこのような何かをしたいですそれを簡単かつ便利に行うことができます。あなたはちょうどその
def validinput(prompt, options):
letters = tuple(options)
choice = input1char(prompt)
while choice not in options:
print("'%s' is not a valid choice! Try again." % choice)
choice = input1char(prompt)
return choice
そして:
def input1char(prompt):
return input(prompt + " >").strip().lower()[:1]
をそしてあまりにも独自の機能にwhileループを抜け出す:まず、あなたは、それが二回呼ばれていますから、別の関数にinput
ものを抜け出すことができます書き込み:
choice = validinput("Enter v for validate, or g for generate", "vg")
'else else'文を使用 – letsc
例外がスローされないため、except節は実行されません。 @letscのような 'if else'型ロジックを使用してください。 – richardhsu
'もしchoice == 'v'かchoice == 'g':' – roganjosh