2016-10-19 4 views
0

私がやろうとしているのは、コードの検証や生成を行うかどうかをユーザーが選択できるように、プログラムでメニュースタイルの開始を作成することです。試してみる(TypeError)

choice = input("enter v for validate, or enter g for generate").lower() 

try: 
    choice == "v" and "g" 

except TypeError: 
    print("Not a valid choice! Try again") 
    restartCode() *#pre-defined function, d/w about this* 

だから私は、ユーザーが、彼らは大文字で入力した場合は含まない「V」または「G」(以外のものを入力すると機能を定義したという声明を印刷して行う出力に私のプログラムをしたいと思います:コードは、このようになりますそれらの文字のバージョン)。 私のtryとexceptの機能には何か問題がありますが、ユーザーが2文字以外の何かを入力すると、コードが終了します。

+4

'else else'文を使用 – letsc

+0

例外がスローされないため、except節は実行されません。 @letscのような 'if else'型ロジックを使用してください。 – richardhsu

+0

'もしchoice == 'v'かchoice == 'g':' – roganjosh

答えて

2

お試しください。

choice = input("enter v for validate, or enter g for generate").lower() 

if (choice == "v") or (choice == "g"): 
    #do something 
else : 
    print("Not a valid choice! Try again") 
    restartCode() #pre-defined function, d/w about this* 

しかし、本当にtry/exceptを使用したい場合は、目的の入力を保存して比較することができます。エラーはTypeErrorではなくKeyErrorになります。

choice = input("enter v for validate, or enter g for generate").lower() 
valid_choices = {'v':1, 'g':1} 

try: 
    valid_choices[choice] 
    #do something 

except: 
    KeyError 
    print("Not a valid choice! Try again") 
    restartCode() #pre-defined function, d/w about this 
+0

ありがとう!私はtryとexcept文を使用しようとしていましたがwhileループを使って "choice == v"と言っていましたが、これは単純で効果的です。 – AntsOfTheSky

+0

@HeatherLara私の編集を参照してください –

2

try/exceptについては混乱しています。 try/exceptは、エラーが発生する可能性がある場合に使用されます。プログラム内のすべてが有効なので、エラーは発生しません。エラーは、コードに実行エラーがある場合にのみ発生します。エラーは、必要とされたときだけに発生するものではありません。

ただし、有効な選択肢を入力しないとエラーが表示されます。代わりにロジックif/elseを使用し、エラーを自分で印刷する必要があります。そして副注釈として、choice == "v" and "g"の行は、選択肢が'v'または'g'に等しいかどうかをテストしません。選択肢iがvに等しいか、そして文字列'g'が "真実"であるかどうかをテストします。あなたはestenially私はそれはあなたが望むものではないかなり確信している

if variable = value and True

を言って。ここで私はあなたのコードを書き直す方法です。

if choice.lower() in {"v", "g"}: # if choice is 'v' or 'g' 
    # do stuff 
else: # otherwise 
    print("Not a valid choice! Try again") # print a custom error message. 
+0

'vgの'の選択はトラップのビットです。 'print(" in "vg") 'を試してください。 :-) – kindall

+0

@kindallああ!それをキャッチするためにありがとう;)時々私は自分の利益のために巧みにしようとする。 –

+0

ちょうど先週、私はそれに巻き込まれました。 :-) – kindall

2

問題は、あなたのtryexceptではなく、あなたがすべてでtryexceptを使用しているという事実ではありません。 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") 
関連する問題