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

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


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


当前回答

检查对象类型的最Python方法是……不检查它。

既然Python鼓励Duck打字,那么您应该尝试。。。除了按照您想要的方式使用对象的方法。因此,如果您的函数正在寻找一个可写的文件对象,不要检查它是否是文件的子类,只需尝试使用它的.write()方法!

当然,有时这些好的抽象会崩溃,而isinstance(obj,cls)正是您所需要的。但要谨慎使用。

其他回答

isinstance(o, str)

链接到文档

您可以使用类型的__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'

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

例子:

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

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

如果o是str或是从str继承的类型,isinstance(o,str)将返回True。

如果且仅当o是str时,type(o)is str将返回True。如果o是从str继承的类型,则返回False。

致雨果:

您可能是指列表而不是数组,但这表明了类型检查的全部问题——您不想知道所讨论的对象是否是列表,您想知道它是某种序列还是单个对象。所以试着像一个序列一样使用它。

假设您要将对象添加到现有序列中,或者如果是一个对象序列,请将它们全部添加

try:
   my_sequence.extend(o)
except TypeError:
  my_sequence.append(o)

这样做的一个技巧是,如果您正在处理字符串和/或字符串序列-这很棘手,因为字符串通常被认为是单个对象,但它也是一个字符序列。更糟糕的是,它实际上是一个单长度字符串序列。

我通常选择设计我的API,使它只接受一个值或一个序列,这使事情变得更容易。如果需要,在传递单个值时,在其周围加上[]并不困难。

(虽然这可能会导致字符串错误,因为它们看起来确实像序列。)