有没有一种简单的方法来确定变量是列表、字典还是其他什么?


当前回答

除了前面的答案之外,值得一提的是collections.abc的存在,它包含几个补充duck类型的抽象基类(abc)。

例如,不必显式检查某项内容是否为列表,而是:

isinstance(my_obj, list)

如果您只想查看所拥有的对象是否允许获取项目,可以使用collections.abc.Sequence:

from collections.abc import Sequence
isinstance(my_obj, Sequence) 

如果您对允许获取、设置和删除项目(即可变序列)的对象非常感兴趣,那么您可以选择collections.abc.MutableSequence。

这里还定义了许多其他ABC,可以用作映射的对象的映射、Iterable、Callable等。所有这些的完整列表可以在collections.abc的文档中看到。

其他回答

type()是比isinstance()更好的解决方案,尤其是对于布尔值:

True和False只是python中表示1和0的关键字。因此

isinstance(True, int)

and

isinstance(False, int)

两者都返回True。两个布尔值都是整数的实例。然而,type()更聪明:

type(True) == int

返回False。

为了完整起见,isinstance不适用于非实例的子类型的类型检查。虽然这很有道理,但没有一个答案(包括公认的答案)涵盖了这一点。请使用issubclass。

>>> class a(list):
...   pass
... 
>>> isinstance(a, list)
False
>>> issubclass(a, list)
True

在对象的实例上,还具有:

__class__

属性下面是一个来自Python3.3控制台的示例

>>> str = "str"
>>> str.__class__
<class 'str'>
>>> i = 2
>>> i.__class__
<class 'int'>
>>> class Test():
...     pass
...
>>> a = Test()
>>> a.__class__
<class '__main__.Test'>

请注意,在python3.x和NewStyle类(可从Python2.6中选择)中,类和类型已经合并,这有时会导致意外的结果。主要是因为这个原因,我最喜欢的测试类型/类的方法是使用内置函数。

使用类型()

x='hello this is a string'
print(type(x))

输出

<class 'str'>

要仅提取str,请使用

x='this is a string'
print(type(x).__name__)#you can use__name__to find class

输出

str

如果使用类型(变量)__name__我们可以读

value = 12
print(type(value)) # will return <class 'int'> (means integer)

或者你可以这样做

value = 12
print(type(value) == int) # will return true