SyntaxError:在使用if时使用缩进块,在使用空块时使用elif

时间:2014-07-26 19:08:01

标签: python shell python-idle

显然我的代码有问题。当我使用Python 3.3.3 Shell运行以下模块时,我收到错误SyntaxError: expected an indented block。然后IDLE在第7行突出显示elif

def user_input():
    print('[1]: ASCII to Binary')
    print('[2]: Binary to ASCII')
    user_input = input('Please choose [1] or [2]: ')
    if user_input == ('1', '[1]'):
        #
    elif user_input == ('2', '[2]'):
        #
    else:
        print('Please enter a valid input...')
        user_input()

1 个答案:

答案 0 :(得分:5)

必须在每个ifelif块中包含实际代码,您不能只使用评论。

在这种情况下使用pass statement

if user_input == ('1', '[1]'):
    pass
elif user_input == ('2', '[2]'):
    pass
else:
    print('Please enter a valid input...')
    user_input()

此外,您无法在函数中使用user_input作为局部变量名,而仍然可以通过该名称调用该函数。局部变量影子全局变量,因此user_input()套件中的else:调用将引发TypeError,因为它实际上是将被调用的局部变量引用的字符串。为局部变量使用不同的名称; choice将是一个不错的选择。

接下来,您将字符串与元组进行比较,这两种类型永远不会相等使用in来测试元组中是否有一个等于用户输入的字符串:

if choice in ('1', '[1]'):
    pass

如果您使用了甚至更好的集合({element1, element2, ...}),那么在测试后,集合会更快。

可以只是反转并组合测试,而根本不需要那些空块:

choice = input('Please choose [1] or [2]: ')
if choice not in {'1', '[1]', '2', '[2]'}:
    print('Please enter a valid input...')
    user_input()

最后,使用循环而不是递归来重复输入错误的问题。如果没有将递归调用结果返回到调用链上并避免递归限制(你无法在没有无限期返回的情况下调用函数,那么你可以避免你在这里犯的错误,你会惊讶于有多少用户会尝试看看他们可以继续输入糟糕的选项多长时间。)

while True循环真的会继续:

def user_input():
    print('[1]: ASCII to Binary')
    print('[2]: Binary to ASCII')
    while True:
        choice = input('Please choose [1] or [2]: ')
        if choice in {'1', '[1]', '2', '[2]'}:
            return choice
        print('Please enter a valid input...')

return退出函数(以及循环),否则永远会告诉用户提供有效输入。