【问题标题】:Recursive function to ask for user input in Python with error handling在 Python 中通过错误处理请求用户输入的递归函数
【发布时间】:2019-05-10 19:15:59
【问题描述】:

我正在编写一个需要用户传递信息的小 Python 脚本。由于我的脚本的某些部分可能会引发异常并因此在用户输入格式错误时破坏脚本,我想事先检查一下。这当然是一个有用的措施。为了更好的用户体验,如果输入格式错误,我不希望脚本被中断。相反,应该重新提出这个问题。

因此,我为每个用户输入定义了一个函数,它将在继续下一步之前检查输入。这种检查是通过try、except 错误处理方法完成的,以确保脚本不会被中断。

以下是此类函数的最小示例:

def ask_for_int( prompt = "Please enter an integer:\n" ):
    user_input = input( prompt ).strip()

    # Check if the value can be transformed into a float
    try:
        return int( user_input )
    except:
        ask_for_int( prompt = "You need to pass an integer:\n" )

some_number = ask_for_int()

只要我输入一个整数,这段代码就可以正常工作。如果我向它传递一个字符串,它也会识别 TypeException 并重新请求一个整数。但不幸的是,some_number 变量现在不保存我传递的整数而是空的。

为了清楚起见,请看以下内容:

让我们首先在上一个示例的末尾添加一个print( 'You passed the valid integer: %s' % some_number )。如果我们现在将123 传递给提示符,则打印返回123。万岁!

但是,如果我们通过abc,脚本将拒绝我们的输入并要求一个新的数字,这就是except 在这里工作。现在让我们完成这个任务,实际上传递一个整数,例如321。打印应该返回321当然,因为这是被接受的整数,不是吗?好吧,不幸的是,输出是None。

这是原始输出:

传递一个整数

Please enter an integer:
123
You passed the valid integer: 123

先传一个字符串,再传一个整数

Please enter an integer:
abc
You need to pass an integer:
321
You passed the valid integer: None

【问题讨论】:

    标签: python error-handling user-input


    【解决方案1】:

    您没有返回递归调用的结果,因此该函数返回None。

    你在哪里:

    ask_for_int( prompt = "You need to pass an integer:\n" )
    

    写:

    return ask_for_int( prompt = "You need to pass an integer:\n" )
    

    【讨论】:

    • 哦,这很简单!谢谢!我认为try 块中的return 就足够了,因为except 再次调用该函数,如果现在的值实际上是一个整数,它将应用于try 并因此被返回。但我似乎误解了这个概念。
    【解决方案2】:

    这是因为except 块没有返回任何值。 我建议您将其更改为:

        try:
            user_input = int(user_input)
        except:
            user_input = ask_for_int(prompt="You need to pass an integer:\n")
        return user_input 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多