【问题标题】:Is there a way I can prevent users from entering numbers with input()有没有办法阻止用户使用 input() 输入数字
【发布时间】:2016-09-21 10:06:55
【问题描述】:

我想阻止用户输入数字以节省程序中的麻烦。我知道如何使用 try,除了 int(input()) 以防止在需要整数时输入字符串,但我想知道 str(input()) 是否可以实现类似的事情。

例如,如果要求用户输入他们的姓名并且他们输入“1994”,他们将收到输入整数的错误消息。

【问题讨论】:

  • int(input()) 使用相同的try-except,但现在将引发的异常视为“一切正常”并将成功转换为“出现问题”?
  • 请注意,尝试以这种方式过滤输入是……奇怪。当然,合法的int(可能)不是合法名称。但是floatlist 等都不是合法的。试图将不良输入列入黑名单是徒劳的;白名单最终会变得很棘手,因为它很容易忽略合法字符(例如,空格、撇号和连字符都出现在正常名称中)。我会避免尝试将特定模式列入黑名单,而只是接受它们给你的东西;毕竟,恰好包含数字的 str 并不比名称 !@#$%^ 非法。

标签: python string python-3.x input


【解决方案1】:

try-exceptelse 块一起使用,如果在转换为int 期间发生异常没有,您将在其中引发ValueError(这意味着输入int:

v = input("> ")
try:
    _ = int(v)
except:
    pass
else:
    raise ValueError("input supplied should be of type 'str'")

这将捕获通过在else 块中引发异常输入的任何数字

> 1992

ValueErrorTraceback (most recent call last)
<ipython-input-35-180b61d98820> in <module>()
      5    pass
      6 else:
----> 7    raise ValueError("input supplied should be of type 'str'")

ValueError: input supplied should be of type 'str'

并允许passing 在except 中使用字符串:

> jim

v
Out[37]: 'jim'

或者,您也可以使用 anyisdigit 执行此操作:

v = input("> ")
if any(s.isdigit() for s in v):
    raise ValueError("input supplied should be of type 'str'")

这会检查any 字符是否为数字,如果是则引发错误。


你也可以防止浮动,但这开始变得丑陋:

v = input("> ")
for f in [int, float]:
    try:
        _ = f(v)
    except:
        pass
    else:
        raise ValueError("Numbers not allowed")

【讨论】:

  • 由于int 中的值没有被使用,您可以省略赋值并保留int(v)。当需要名称时(for 循环、tuple 解包等),您只需要 _ 进行“不需要”的分配。
  • @ShadowRanger 我知道,它看起来太糟糕了,我真的不想这样做(不是_ = .. 看起来很棒)。
  • 有没有办法也可以防止浮动?
  • @Blue_Wolf13:这就是为什么I was saying not to do this。如果您阻止float(微不足道的更改,只需调用float 而不是int),您要阻止所有标点符号吗?哦,等等,但是一些标点符号是可以的(连字符、撇号)。前导或尾随空格呢?有无数种方法可以输入非法名称。排除无限的无限子集不是您应该为自己设定的目标。
  • @Blue_Wolf13 我更新了我的答案以包括 floats 但我同意 ShadowRanger,这不是解决您问题的可行方法。
猜你喜欢
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多