如何比较python中的变量类型?

How do I compare variable types in python?

本问题已经有最佳答案,请猛点这里访问。

我正在开发一个简单的程序,它将询问天气和温度,并输出用户应该穿什么样的衣服。但是,我已经到了要确保用户不能输入"g"度或任何其他字符串的地步。有比较变量类型的简单方法吗?换句话说,是否存在以下方面的问题:

1
2
3
if (type(temp) == 'str'):

    print("Invalid. Try again.")

或者类似的事情不太复杂?就我个人而言,我可以使用高级功能和其他功能,但对我的CS老师来说,这看起来很粗略。


请求宽恕比请求许可更容易。

考虑一下我们中的大多数人在这个场景中会做什么(假设使用python 3):

1
temp = int(input("Enter a numerical input:"))

如果我们得到的输入不是数字,我们将用一个ValueError来放大。知道了这一点,我们应该……抓住它:

1
2
3
4
try:
    temp = int(input("Enter a numerical input:"))
except ValueError as e:
    print("Invalid input - please enter a whole number!");

不要乱动类型检查,因为这会使代码少一些Python。相反,不要担心这段代码有可能爆炸;如果有,就抓住异常,稍后再处理后果。


你基本上是对的,只是不需要报价。

1
2
3
4
5
6
>>> type(5) == int
True
>>> type('5') == int
False
>>> type('5') == str
True


python有一个用于检查变量类型的内置函数。从文档

isinstance(object, classinfo)

Return true if the object argument is an
instance of the classinfo argument, or of a (direct, indirect or
virtual) subclass thereof. Also return true if classinfo is a type
object (new-style class) and object is an object of that type or of a
(direct, indirect or virtual) subclass thereof. If object is not a
class instance or an object of the given type, the function always
returns false. If classinfo is neither a class object nor a type
object, it may be a tuple of class or type objects, or may recursively
contain other such tuples (other sequence types are not accepted). If
classinfo is not a class, type, or tuple of classes, types, and such
tuples, a TypeError exception is raised.

例如:

1
2
3
4
5
6
7
8
9
10
>>>n=3
>>>isinstance(n, int)
True
>>>isinstance(n, str)
False
>>>m="example"
>>>isinstance(m, int)
False
>>>isinstance(m, str)
True

我刚遇到这个问题,觉得尽管这个问题很久以前就被问到了,但是为了其他用户的利益,我会提出我的解决方案。

我创建了一个助手函数,通过异常捕获检查类型:

1
2
3
4
5
6
7
def TypeChecker(var):
    result = 1
    try:
        int(var)
   except:
        result = 2
   return

然后在代码主体中,只要我想检查类型标识,就只需编写如下内容:

1
2
if TypeChecker(var1) == TypeChecker(var2):
    do_stuff...

此方法还允许用户根据另一个变量的类型修改变量类型,因为使用此函数,int将返回1,字符串将返回2。