Python类型检查吗?

4
有没有办法从用户输入中检查其类型?并进行如下操作:
if input == str:
   do this
elif input == int:
   do this
else:
   do this

6
在编程中,变量的命名最好不要使用 input(尽管在Python 2中覆盖一个本来就不应该使用的内建函数也不是最糟糕的想法)。 - Wooble
5个回答

5

你可以使用isinstance来检查某个东西的类型,但你真的可能不想这样做...

这还很大程度上取决于你从用户那里获取输入的方式。如果你使用的是raw_input,那么它始终是一个字符串,你需要使用try将其转换为你想要的任何类型:

try:
   x = int(input):
except ValueError:
   try:
       x = float(input):
   except ValueError:
       print "No recognizable type!"

Python的一个基本原则是鸭子类型。如果一个对象看起来像鸭子,声音像鸭子,闻起来像鸭子,那么它就是一只鸭子(前提是你只关心这个对象的外观,气味和声音)。最终,在Python中最好是尝试去做一些事情,看看它是否是“鸭子”。如果它不是一只鸭子,那么你就捕获异常并处理它(如果你知道如何处理)。这是你很少看到人们在他们的代码中使用isinstance的主要原因,也是我警告不要使用它的原因。

1
如果你指的是键盘输入,那么所有的输入都是字符串。即使用户输入一个数字如“88”,结果也将是字符串"88"而不是整数88。但是,你可以使用这个模式来判断字符串是否只包含数字:
if input.isdigit():
    print "input is a number"
else:
    print "input is not a number"

更好的方法是将输入转换为数字,这将处理评论中提到的输入,例如“50.0”或“-10”(如果小数有效,则在此处使用float()或Decimal()而不是int()):
try:
    number = int(input)
except ValueError:
    print "input is not a number"

如果您不是指键盘输入,那么有各种方法来检查类型,但通常最好的方法是将输入视为有效并捕获异常(如果它无效)。这样,您可以根据对象的实际方法和属性定义输入要求,而不仅仅是其名义类别(这就是“鸭子类型”)。

50.0是一个数字。-10也是;-) - mgilson
啊,那是非常正确的!我会修改答案,使用强制转换和异常捕获来代替isdigit()。 - Andrew Gorcester
好的,这取决于情况。raw_input 始终返回一个字符串,而 input(引用文档)是 eval(raw_input(prompt)),因此它可以直接是一个整数。虽然我认为原始问题是关于 raw_input 的 :) - nvlass
是的,在Python 2.x中是这样的(在Python 3中,input()返回一个字符串,如果您想要的是eval(),则必须显式地进行)。不建议在Python 2.x中使用input() - Andrew Gorcester

1

0
我觉得你正在寻找的是 isinstance

你赢了,不过我的带有一个链接:

http://docs.python.org/2/library/functions.html#isinstance


另外,我一直在测试 PyCharm IDE,并且如果您在代码中使用assert isinstance(),它们会自动为您进行类型检查,然后进行自动补全。 它还允许您在文档字符串中指定类型参数。 然后,它使用此类型信息来帮助您在以后完成自动完成。相当方便...


0

isinstance(input, type)

type 内置函数也可以实现相同的功能,但是建议使用 isinstance() 内置函数来测试对象的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接