【问题标题】:Check if the input is a string in python检查输入是否是python中的字符串
【发布时间】:2020-11-17 04:41:11
【问题描述】:

我正在尝试检查我的输入是否是带有 try-except 块的字符串。该函数运行没有错误。但是,它会检查输入是否为整数,而不是字符串。我怎样才能反其道而行之?

def lexicon(word):
    while True:
        try:
            a=str(input(word))
            print("Input is a string. string = ", a)
        except ValueError:
            print("Oops..Input is not supposed to be a number. Try again!")
    return a
b=lexicon("Enter the word you'd like: ")

【问题讨论】:

  • 这能回答你的问题吗? How to find out if a Python object is a string?
  • input 函数总是返回一个字符串,所以检查它是否是一个字符串是毫无意义的。你到底想做什么?
  • 我什至无法理解他为什么将对象参数传递到输入中? @Antimon 正确地指出,他已将每个单词都转换为字符串,因此对数字使用 try-except 块是没有意义的,因为它们无论如何都会被转换为字符串。问题陈述不清楚
  • @Raghav 不仅如此,而且str(input(...)) 是多余的,因为input 的返回值始终是一个字符串。如果它是int(input(...)),则此代码将有意义,但 OP 需要在这里澄清。
  • @Antimon 如果输入是一个整数,我想告诉用户这是一个错误,他们需要输入一个字符串作为输入

标签: python function loops try-catch


【解决方案1】:

正如用户 pavel 在 cmets 中对他的回答所讨论的那样,有两种不同的样式可以为这样的问题编写代码:EAFP(“请求宽恕比许可更容易”),这意味着您可以让您的代码在一个假设并在失败时采取行动;和 LBYL(“在你跳跃之前”),您首先检查您的假设是否正确,然后然后选择要采取的适当行动。

try/except 路由是 EAFP,因为它只是执行 try 块中的代码,而无需先检查它是否会工作。如果您想以 LYBL 样式执行此操作,您将明确需要确定用户输入是否是数字值的字符串表示,然后采取相应措施。我将在下面为这两种方法提供骨架代码。但是,请注意,Python 与其他语言相比有点奇怪,因为它似乎对 EAFP 有一定的文化偏好。

另外,由于您只是询问是否检查整数,我将在此重点介绍。这意味着代码将接受浮点数作为有效输入。

EAFP:try/except

可能让你感到困惑的问题是input总是返回一个字符串,所以测试它是否是一个字符串是无意义的,并且总是会产生True。但是请注意,try/except 只是您可以在 Python 中执行的错误处理的简化版本;完整版是try/except/else/finally。如果 no except 块被执行,else 块就会生效,并且 finallyalways 在最后运行的。因此,您可以检查您的输入是否为整数,如果检查成功,则使程序引发失败。不过我承认这确实有点倒退。

try:
    a = int(input())
except ValueError:
    # do whatever
else:
    raise ValueError("Input must not be an integer")

LBYL:if/else

str 对象有几种方法可以测试其内容而不会遇到错误。例如,.isalpha() 检查是否所有字符都在字母表中(如果包含空格和特殊字符,则返回 False); isnumeric() 检查字符串是否是数字的表示;等等。查看完整列表here。因此,根据您想要允许的输入类型,您需要在if 块中使用这些方法之一或它们的组合。下面的代码本质上与上面的try/except/else 版本执行相同的操作,使用.isdigit(),如果字符串中的所有字符都是数字,则返回True(即int(a) 会成功的相同类型的输入)。

还要注意,我在这段代码中使用了新的赋值运算符:=,这是 Python 3.8 的新功能。这样,您不需要首先显式分配变量a,但是要捕获代码实际执行input() 函数的位置有点困难。如果您为向后兼容编写代码,或者不喜欢它的外观,则必须先使用经典的 a = input()

if (a := input()).isdigit():
    raise ValueError("Input must not be an integer")

# do whatever

【讨论】:

  • 非常感谢您详细、清晰的解释!
【解决方案2】:

如果你想专门检查字符串的值类型,你最好使用if/elseisinstance

if not isinstance(word, str):
    raise TypeError(f"Expecting a string as a value, not {type(word)}.")
else:
    #do something

【讨论】:

  • 但是请注意,Python 偏爱EAFP style(“请求宽恕比请求许可更容易”),因此try/except 可能被认为更惯用。
  • @Antimon,我猜,这真的取决于你的代码在做什么。如果变量被立即使用或非常接近它的声明位置,try-except 听起来是个好主意,但如果变量被提前声明并且仅在执行的更晚时使用,我认为最好进行早期检查并引发错误。
  • 另外我认为if isinstance()if not isinstance() 在Python 中都非常地道,但我可能错了。
  • 你会如何使用 try/except 块来做到这一点?
猜你喜欢
  • 2013-01-25
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2011-08-12
  • 2011-07-22
相关资源
最近更新 更多