【问题标题】:Input validator function does not accept valid input输入验证器函数不接受有效输入
【发布时间】:2022-10-22 15:14:42
【问题描述】:

以下函数采用输入提示参数。 它要求用户输入1或者2, 并在输入其他内容时打印“无效输入”。然后该函数再次要求用户输入。我想知道是否有不涉及 try/except 语句或递归的更清洁的解决方案。

def input_params(prompt):
    while True:
        try:
            user_input = int(input(prompt))
            if user_input == 1 or user_input == 2:
                return user_input
            else:
                print("Invalid Input")
                input_params(prompt)
        except ValueError:
            pass

【问题讨论】:

  • 这段代码最糟糕的部分是你将递归和循环结合起来,和您没有返回递归调用的返回值。解决这个问题,然后您可以担心是否正确处理来自对int 的调用的潜在ValueErrors。
  • 为什么x 首先是函数的参数,当您立即将其替换为用户输入时?
  • 你将如何解决这个问题?你会在inputParams() 递归之后说return x, y 吗?
  • 需要明确的是,该功能的目的仅仅是提示用户输入直到他们输入1 或2?
  • @chepner,此代码是较大部分的一部分,需要 x 参数才能工作,我相信您可以在任何解决方案中忽略它

标签: python


【解决方案1】:

跳过递归,在检查整数值之前使用ValueError 继续循环。

def inputParam(prompt):
    while True:
        x = input(prompt)
        try:
            n = int(x)
        except ValueError:
            print("Invalid integer input")
            continue

        if n == 1 or n == 2:
            return n

        print("Enter 1 or 2")

【讨论】:

    【解决方案2】:

    而不是将其作为列表[1,2]。我已经完成了:if int(x) == 1 or int(x) == 2:

    代码 :

    def userInput():
        while True:
            x = input("Enter value : ")
    
            if x.isnumeric() :
                if int(x) == 1 or int(x) == 2:
                    return x
            else:
                print('Not Number')
    
    userInput()
    

    如果上面的代码有任何问题,请随时纠正我

    【讨论】:

    • 嘿,这太神奇了,这完全消除了 ValueError 并且非常简短易读,也许不是 x.isnumeric,一个代码忽略了整个 int(x) 部分,并简单地询问 if x == "1" or x == "2", else: print("Invalid Input")This 我觉得进一步简化了它,因为我我不熟悉 .isnumeric()。如果需要处理的输入需要是 int,我们也可以简单地 return int(x)
    • @PythonProgrammer:感谢您的宝贵意见,您可以进行编辑以批准它
    【解决方案3】:

    你可以这样做:

    def inputParams(prompt):
        while True:
            x = input(prompt)
            if x.isnumeric():
                x = int(x)
                if x in [1, 2]:
                    return x
                else:
                    print("Invalid input!")
            else:
                print("please input only number")
    

    【讨论】:

      【解决方案4】:

      如果您想完全避免 try-except 块,可以使用以下代码。使用contextlib.suppress 并不常见,但在这种孤立的情况下,它可以很好地工作。

      import contextlib
      
      def inputParams(prompt):
          while True:
              with contextlib.suppress(ValueError):
                  if (x := int(input(prompt))) in [1, 2]:
                      return x
              print("Invalid input, try again.")
      
      print(f"You entered {inputParams('Enter 1 or 2: ')}.")
      

      【讨论】:

      • 这让我很困惑,但它确实有效。肯定会查看 contextlib 文档,因为值错误因素已完全消除!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2020-05-11
      • 2018-12-31
      • 1970-01-01
      • 2012-10-28
      • 2023-01-13
      • 1970-01-01
      相关资源
      最近更新 更多