Python:输入验证

时间:2014-02-08 03:06:41

标签: python validation

我问用户他们是否想要先行并使用输入验证,以便只接受“y”“Y”“n”或“N”作为有效回复。我运行它时,我的代码似乎崩溃了。

choice = raw_input("Would you like to go first or not? (y/Y or n/N): ")
print ""

try:
    valid_choice = False
    while not valid_choice:
        if choice == "y" or choice == "Y":
            users_turn = True
            valid_choice = True
        elif choice == "n" or choice == "N":
            users_turn = False
            valid_choice = True
            break
    else:
            print "Invalid Choice."

except NameError:
    print "You can only enter y/Y or n/N"

3 个答案:

答案 0 :(得分:2)

啊,你代码中的流程有太多可能的路径。您可以使用以下内容简化它:

question = "Would you like to go first or not? (y/Y or n/N): "
choice = raw_input(question)
while choice not in ['y', 'Y', 'n', 'N']:
    print 'Invalid choice'
    choice = raw_input(question)
users_turn = choice in ['y', 'Y']

话虽如此,我应该说控制台应用程序使用(Y/n)来表示它接受字母yn作为响应是一种常见模式大小写),但大写字母表示默认选项。

因此,如果您在第一次要求输入问题时可以信任用户做出决定,您可以设置默认响应并将其编码为:

choice = raw_input('Would you like to go first? (Y/n)')
users_turn = choice.lower() not in ['n', 'no']

答案 1 :(得分:0)

作为埃利亚斯回答的替代方案,我想提出以下内容:

while True:
    choice = raw_input("Would you like to go first or not? (y/Y or n/N): ")
    if choice in ["y", "Y", "n", "N"]:
        break
    print "Invalid choice"
users_turn = choice in ["y", "Y"]

最好不要重复询问行,但更糟糕的是while True / break语法有点难看(如果Python有do那就太好了...... while喜欢C,但唉)。为自己选择最喜欢的。 :)

此外,只是要指出您自己的代码中的一些错误:

  • try ... except NameError块完全是多余的,因为代码中的任何内容都不会抛出NameError,尤其是不会发出实际用户错误的信号。
  • 您的else行有错误的缩进。就目前而言,它与while块而不是if / elif块匹配,导致您很可能不想要的行为。
  • break块中的elif是多余的,因为当您将while设置为valid_choice时,True循环将会退出。
  • 最重要的是,当用户键入无效答案时,您不会重新设置用户,导致代码永远循环。也许这是你所说的未指明的崩溃?

答案 2 :(得分:0)

def get_one_of(prompt, options, default=None):
    options = set(options)
    while True:
        val = raw_input(prompt)
        if val == '' and default is not None:
            return default
        elif val in options:
            return val

response = get_one_of('Do you want to go first? [Yn] ', 'yYnN', 'y')
users_turn = response in 'yY'