如何检查对象是否为给定类型,或是否从给定类型继承?

如何检查对象o是否为str类型?


初学者通常错误地期望字符串已经是“数字”——要么期望Python 3.x输入转换类型,要么期望像“1”这样的字符串同时也是整数。对于这些问题,这是错误的规范。请仔细阅读问题,然后使用How do I check if a string representative a number(float or int)?,如何将输入读取为数字?和/或询问用户输入,直到他们给出适当的有效响应。


当前回答

您可以使用类型的__name__检查变量的类型。

Ex:

>>> a = [1,2,3,4]  
>>> b = 1  
>>> type(a).__name__
'list'
>>> type(a).__name__ == 'list'
True
>>> type(b).__name__ == 'list'
False
>>> type(b).__name__
'int'

其他回答

我认为使用Python这样的动态语言很酷的一点是你真的不需要检查这样的东西。

我只需要在对象上调用所需的方法并捕获AttributeError。稍后,这将允许您使用其他(看似无关的)对象调用方法,以完成不同的任务,例如模拟对象进行测试。

在使用urllib2.urlopen()从web获取数据时,我经常使用这种方法,它返回一个类似文件的对象。这又可以传递给几乎任何从文件读取的方法,因为它实现了与实际文件相同的read()方法。

但我确信使用isinstance()是有时间和地点的,否则它可能不会出现:)

对于更复杂的类型验证,我喜欢typeguard基于python类型提示注释进行验证的方法:

from typeguard import check_type
from typing import List

try:
    check_type('mylist', [1, 2], List[int])
except TypeError as e:
    print(e)

您可以以非常清晰易读的方式执行非常复杂的验证。

check_type('foo', [1, 3.14], List[Union[int, float]])
# vs
isinstance(foo, list) and all(isinstance(a, (int, float)) for a in foo) 

在Python中,可以使用内置的isinstance()函数来检查对象是否为给定类型,或者是否从给定类型继承。

要检查对象o是否为str类型,可以使用以下代码:

if isinstance(o, str):
# o is of type str

您还可以使用type()函数检查对象类型。

if type(o) == str:
# o is of type str

还可以使用issubclass()函数检查对象是否是特定类的子类。

if issubclass(type(o),str):
# o is sub class of str
isinstance(o, str)

链接到文档

我认为最好的方法是键入好变量。您可以使用“键入”库来完成此操作。

例子:

from typing import NewType
UserId = NewType ('UserId', int)
some_id = UserId (524313`)

看见https://docs.python.org/3/library/typing.html.