如何加强我的代码以进行意外输入?

时间:2013-08-08 01:14:40

标签: python-3.x

while True:
    race = int(input('1. Roegadyn\n'
                     '2. Hyur\n'
                     '3. Elezen\n'
                     '4. Mi\'Qote\n'
                     '5. Lalafell\n'
                     'Choose a race: '))
    if (race not in range(1,6)):
        print('\nInvalid Entry.\n')
    else:
        break

当我试图打破这一点时,这很容易,现在看起来很明显为什么它如此糟糕。任何关于给出我的查询结构完整性的建议都将非常感激。谢谢你帮助一个菜鸟。

2 个答案:

答案 0 :(得分:1)

将您的条目拆分为单独的结构,并将其用于适当的值。并检查例外情况。

rmap = {n: r for (n, r) in enumerate(['Roegadyn', 'Hyur',…], 1)}

while True:
    for n, r in sorted(rmap.items()):
        print('{}. {}'.format(n, r))
    rval = input('Choose a race: ')
    try:
        rnum = int(rval)
    except ValueError:
        pass
    else:
        if rnum in rmap:
            break
    print('Invalid Entry')

答案 1 :(得分:0)

为了完整起见,我想提一个更简单的解决方案:

races = ["Roegadyn", "Hyur", "Elezen", "Mi'Qote | Seekers of the Sun", "Lalafell"]

while True:

    print(*("{}. {}".format(*race_info) for race_info in enumerate(races, 1)),
          sep="\n")

    try:
        race = races[int(input('Choose a race: '))-1]
    except (ValueError, IndexError):
        print('\nInvalid Entry.\n')
    else:
        break

这种解决方案的优点是两个问题(非数字输入和索引超出范围)都在相同的基础上处理,这使得代码更清晰。特别是,不需要对数字输入进行明确检查。

伊格纳西奥的解决方案很好,但它将“先看你跳跃”方法(rnum in rmap)与“更容易请求宽恕而非许可相混合“(try)。由于这两个错误通常都很少见,因此最好将正常行为(break)放在try… else子句中。

旁注:您的比赛列表中不需要\'转义,因为可以使用"…"引号,就像这里一样。在原始问题中,您可以使用相同的方式使用字符串连接:'Roegadyn' … "Mi'Qote" …

PS:在这个解决方案中,race实际上是一个种族而不是种族参考号,与原始问题相反。对于数字race,可以改为try: race = int(…); races[race] except…(但这看起来不太好)。