如何检查对象是否为给定类型,或是否从给定类型继承?
如何检查对象o是否为str类型?
初学者通常错误地期望字符串已经是“数字”——要么期望Python 3.x输入转换类型,要么期望像“1”这样的字符串同时也是整数。对于这些问题,这是错误的规范。请仔细阅读问题,然后使用How do I check if a string representative a number(float or int)?,如何将输入读取为数字?和/或询问用户输入,直到他们给出适当的有效响应。
如何检查对象是否为给定类型,或是否从给定类型继承?
如何检查对象o是否为str类型?
初学者通常错误地期望字符串已经是“数字”——要么期望Python 3.x输入转换类型,要么期望像“1”这样的字符串同时也是整数。对于这些问题,这是错误的规范。请仔细阅读问题,然后使用How do I check if a string representative a number(float or int)?,如何将输入读取为数字?和/或询问用户输入,直到他们给出适当的有效响应。
当前回答
我认为使用Python这样的动态语言很酷的一点是你真的不需要检查这样的东西。
我只需要在对象上调用所需的方法并捕获AttributeError。稍后,这将允许您使用其他(看似无关的)对象调用方法,以完成不同的任务,例如模拟对象进行测试。
在使用urllib2.urlopen()从web获取数据时,我经常使用这种方法,它返回一个类似文件的对象。这又可以传递给几乎任何从文件读取的方法,因为它实现了与实际文件相同的read()方法。
但我确信使用isinstance()是有时间和地点的,否则它可能不会出现:)
其他回答
检查类型的一个简单方法是将其与您所知道的类型进行比较。
>>> a = 1
>>> type(a) == type(1)
True
>>> b = 'abc'
>>> type(b) == type('')
True
isinstance(o, str)
链接到文档
我认为使用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)
致雨果:
您可能是指列表而不是数组,但这表明了类型检查的全部问题——您不想知道所讨论的对象是否是列表,您想知道它是某种序列还是单个对象。所以试着像一个序列一样使用它。
假设您要将对象添加到现有序列中,或者如果是一个对象序列,请将它们全部添加
try:
my_sequence.extend(o)
except TypeError:
my_sequence.append(o)
这样做的一个技巧是,如果您正在处理字符串和/或字符串序列-这很棘手,因为字符串通常被认为是单个对象,但它也是一个字符序列。更糟糕的是,它实际上是一个单长度字符串序列。
我通常选择设计我的API,使它只接受一个值或一个序列,这使事情变得更容易。如果需要,在传递单个值时,在其周围加上[]并不困难。
(虽然这可能会导致字符串错误,因为它们看起来确实像序列。)